【发布时间】:2020-10-02 12:17:03
【问题描述】:
我正在努力成功地从字节解码 JPEG 图像,然后再次解码为 JPEG。
我从 MJPG 字节流中的编码帧开始,我想对其进行解码以便使用 OpenCV 进行操作。我是 Python、numpy、opencv 等方面的新手!
我现在将文本文件中的帧 JPG 数据保存为:b'\xf\xd8\xff\xdb\x00..etc 等用于测试目的:
当我尝试在第 14 行 (npFlat.reshape((640,480)) 上将 numpy 数组的大小调整为原始视频流分辨率 (640, 480) 时,代码似乎失败了
**ValueError: 无法将大小为 228140 的数组重新整形为 (640,480)*
import io
import cv2
import numpy as np
BytesFile = open('FrameBytes.txt')
MyBytes=BytesFile.read()
BytesFile.close()
dt=np.dtype(np.unit8)
dt=dt.newbtyeorder('>')
npFlat = np.fromfile('FrameBytes.txt'.dtype=dt)
npResized = npFlat.reshape(640,480,3) #CODE FAILING TO RESIZE AT THIS LINE...
cv.imshow('resized',npResized)
难道即使我的视频帧是从 640、480 源中捕获的,但由于某种原因,在编码过程中大小发生了变化?这就是我目前所能想到的。欢迎任何/所有帮助。
我已经查看了相关帖子:Python - byte image to NumPy array using OpenCV,但试图避免 PIL,并且 frombuffer 方法对我来说似乎也失败了。
好的,所以我取得了一些进展,现在有了:
npFlat = np.frombuffer(MyBytes.encode('utf-8'),dtype=np.int8).
当我将 npFlat 'reshape' 为 (374, 610) 时,我现在也可以让代码成功。 IE。所以 374 x 610 = 长度为 228140 的平面 numpy 数组......但这一切似乎都很奇怪。缓冲区信息代表我正在尝试重新打开的 JPG……但还没有关闭。
MyBytes.txt" 数据输入文件可在此处查看: https://drive.google.com/file/d/18pqILl9myeTRjdiqtExFyOe94Km_aNNM/view?usp=sharing]1
【问题讨论】:
-
嗯,因为 640*480*3 != 228140。调整大小是指整形还是重新采样?
-
重塑 - 我在原始帖子中添加了更多信息。我正在尝试从缓冲区(已知帧)解码 JPG 以使用 opencv 打开和编辑...
-
Your
MyBytes对象具有实际的 JPG 文件字节 - 必须首先使用例如 PIL 将其解码为像素数据的内存表示,然后才能将其视为图像在 Python 代码中。 -
请发布您的实际代码!我相当肯定
import nump as np不会运行。newbtyorder也没有。此外,请使用 Dropbox 或 GoogleDrive 或其他方式共享您的输入文件。谢谢。 -
谢谢,马克明天晚上回来。在上面的 numpy 导入上修改了错字 - 我正在努力跨 VNC 复制我的实际代码。 newbyteorder 我现在没有使用。似乎没有必要。
标签: python-3.x numpy image-processing jpeg string-decoding