如何在不保存图像的情况下将 Numpy 数组图像转换为 JPEG?

How to convert a Numpy array image to a JPEG without saving the image?

我正在使用 Microsoft Azure 的 Face API 检测视频中人物的情绪。我有一个 Python 程序可以正确处理本地图像,现在我正在尝试拍摄本地视频并将每一帧发送到 API,并存储每个分析的结果。

发送到 Azure Face API 的数据需要是一个 PNG/JPG 文件,按字节读取:

image_data=open(image_source, "rb").read()

OpenCV 似乎是通过 Python 逐帧浏览视频的标准,但帧是 Numpy 数组类型。您可以拍摄视频的每一帧并将其作为 JPG 保存到磁盘,如下所示:

import cv2 # OpenCV
vidcap = cv2.VideoCapture('vid.mp4')
success, image = vidcap.read()
count = 1
while success:
  cv2.imwrite("video_data/frame_%d.jpg" % count, image)    
  success, frame = vidcap.read() # frame is a Numpy array
  print('Saved frame ', count)
  count += 1

但这并不是我想要的。有没有办法在不将文件保存到磁盘的情况下将 Numpy 数组转换为 JPG?我只想将它转换为 JPG,然后将该图像作为字节发送到 Azure API。

感谢任何和所有的建议和指导,谢谢!

编辑:通过将 Numpy 数组框架转换为 PIL Image 对象并通过 BytesIO 库模块将其转换为 PNG,我有一个可行的解决方法。如果有人有更多 efficient/nicer/cleaner/better 解决方案,我仍然很乐意听到他们!

你只需要cv2.imencode()这样:

success, frame = vidcap.read()
_, JPEG = cv2.imencode('.jpeg', frame)

JPEG 现在将是一个包含 JPEG 编码图像的 Numpy 数组。如果你想把它作为字节发送到Azure,你可以发送:

JPEG.tobytes()