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

问题描述

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

发送到 Azure 的人脸 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,我有一个可行的解决方法。如果有人有任何更有效/更好/更清洁/更好的解决方案,我仍然很想听听他们的意见!

解决方法

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

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

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

JPEG.tobytes()