我正在使用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,我有了一个变通方法。如果有人有更有效/更好/更干净/更好的解决方案,我仍然很乐意听到他们!
发布于 2021-02-03 22:19:49
您只需要如下所示的cv2.imencode()
:
success, frame = vidcap.read()
_, JPEG = cv2.imencode('.jpeg', frame)
JPEG
现在将是一个包含JPEG编码图像的Numpy数组。如果你想把它作为字节发送到Azure,你可以发送:
JPEG.tobytes()
https://stackoverflow.com/questions/66033622
复制相似问题