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

osc*_*aro 2 python opencv numpy face-api

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

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

image_data=open(image_source, "rb").read()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我通过将 Numpy 数组框架转换为 PIL 图像对象并通过 BytesIO 库模块将其转换为 PNG 找到了一个可行的解决方法。如果有人有任何更高效/更好/更清洁/更好的解决方案,我仍然很乐意听到他们!

Mar*_*ell 9

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

success, frame = vidcap.read()
_, JPEG = cv2.imencode('.jpeg', frame)
Run Code Online (Sandbox Code Playgroud)

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

JPEG.tobytes()
Run Code Online (Sandbox Code Playgroud)