opencv 从字节读取视频

3mpgtkmj  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(169)

我正在使用Flask编写简单的REST API,它读取上传的视频并返回一些JSON。视频作为文件通过POST请求发送,内容类型为application/x-www-form-urlencoded
我想用opencv来处理它,但是我不知道如何从原始二进制字符串中读取它。我想到的唯一解决方案是将视频保存到文件中,然后使用opencv VideoCapture类来读取它。但是我想避免IO操作,因为我认为这会降低我的API速度。
所以我的问题是:
如何将视频从原始字节表示转换为opencv表示(numpy数组列表)?

o3imoua4

o3imoua41#

如果您将视频作为文件上传到服务器,那么听起来就像您已经将其保存到了文件中-在这种情况下,简单地从文件中阅读它可能不会那么低效。
视频通常太大,无法放入内存,所以无论如何,它很可能会进入磁盘并返回。
如果你想让你的openCV程序直接接受流媒体视频,进行处理,然后做你接下来想做的任何事情(例如保存到文件,显示,流到其他地方),那么通常最简单的方法是将视频流到OpenCV程序(如果可能的话),并使用OpenCV直接读取流:

VideoCapture cap;
cap.open(yourStreamURL);
rqcrx0a6

rqcrx0a62#

我知道现在回答这个问题有点太晚了。实际上我不知道你是如何以字符串的形式接收视频的。但是我试着模拟你的情况。我以字节串的形式打开了一个图像

f = open('image.jpg','rb')
data = f.read()
f.close()
print(data)

输出为

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00`\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x01q\x01n\x03\x01"\x00\x02\...

然后转换为numpy数组:

img_array = np.asarray(bytearray(data), dtype=np.uint8)
im = cv2.imdecode(img_array, 0)
cv2.imshow("test", im)
cv2.waitKey()

而且它显示图像。希望这对你有帮助

相关问题