将图像字节数据流解码为 JPEG
Decode image bytes data stream to JPEG
我正在努力从字节成功解码 JPEG 图像,然后再次返回 JPEG。
我从 MJPG 字节流的编码帧开始,我想对其进行解码以便使用 OpenCV 进行操作。我在 Python、numpy、opencv 等方面有点新手!
我现在在一个文本文件中有帧 JPG 数据,如:b'\xf\xd8\xff\xdb\x00...等等,用于测试目的:
当我尝试在第 14 行将 numpy 数组的大小调整为原始视频流分辨率 (640, 480) 时,代码似乎失败了 (npFlat.reshape((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 的源中捕获的,但由于某种原因在编码过程中尺寸发生了变化?这就是我目前能想到的。 Any/all 欢迎帮助。
我已经查看了相关的 post: 但试图避免 PIL,而且 frombuffer 方法对我来说似乎也失败了。
好的,所以我取得了一些进展,现在有:
npFlat = np.frombuffer(MyBytes.encode('utf-8'),dtype=np.int8).
当我 'reshape' npFlat 到 (374, 610) 时,我现在也可以让代码成功。 IE。所以 374 x 610 = 平面 numpy 数组,长度为 228140...但这一切看起来很奇怪。缓冲区信息表示我正在尝试重新打开的 JPG...但尚未关闭。
MyBytes.txt" 数据输入文件可在此处查看:
https://drive.google.com/file/d/18pqILl9myeTRjdiqtExFyOe94Km_aNNM/view?usp=sharing]1
您的 FrameBytes.txt 文件,尽管扩展名实际上是一个 JPG 文件
(除非你在保存时弄乱了它)。
所以,你没有用正确的图像 reader 读取它,而不是字节,
如果您想将其作为图像进行操作。否则,你有
JPEG 编码字节 - 磁盘上的 228140 字节代表一个图像
解压后有 921600 字节的数据。 (这是合理的
高质量的 jpeg 文件)。
只需使用 PIL 即可:
from PIL import Image
img = Image.open("FrameBytes.txt")
print(img.size) # this should print (640, 480).
# to convert it to a numpy array:
import numpy as np
data = np.array(list(img.tobytes()), dtype="uint8")
data.shape = img.size + (3,)
...
如果您不想使用 PIL,当然,您可以使用其他库 - opencv 本身具有开箱即用的 cv2.imread
方法。
你弄得一团糟 - 你应该避免将二进制数据保存为文本文件!
将文件内容复制到剪贴板 - 在 Mac 上,命令是:
cat frame.txt | pbcopy
启动Python并创建一个名为s
的变量并将其设置为剪贴板的内容:
s = PASTE_YOUR_CLIPBOARD
现在做:
from PIL import Image
from io import BytesIO
# Load image from BytesIO
im = Image.open(BytesIO(s))
# Display image and save image
im.show()
im.save('result.png')
如果您使用的是 OpenCV,请使用:
import cv2
# Make s as above
s = PASTE_YOUR_CLIPBOARD
i = np.frombuffer(s,dtype=np.uint8)
im = cv2.imdecode(i,cv2.IMREAD_UNCHANGED)
cv2.imwrite('result.png',im)
我正在努力从字节成功解码 JPEG 图像,然后再次返回 JPEG。
我从 MJPG 字节流的编码帧开始,我想对其进行解码以便使用 OpenCV 进行操作。我在 Python、numpy、opencv 等方面有点新手!
我现在在一个文本文件中有帧 JPG 数据,如:b'\xf\xd8\xff\xdb\x00...等等,用于测试目的:
当我尝试在第 14 行将 numpy 数组的大小调整为原始视频流分辨率 (640, 480) 时,代码似乎失败了 (npFlat.reshape((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 的源中捕获的,但由于某种原因在编码过程中尺寸发生了变化?这就是我目前能想到的。 Any/all 欢迎帮助。
我已经查看了相关的 post:
好的,所以我取得了一些进展,现在有:
npFlat = np.frombuffer(MyBytes.encode('utf-8'),dtype=np.int8).
当我 'reshape' npFlat 到 (374, 610) 时,我现在也可以让代码成功。 IE。所以 374 x 610 = 平面 numpy 数组,长度为 228140...但这一切看起来很奇怪。缓冲区信息表示我正在尝试重新打开的 JPG...但尚未关闭。
MyBytes.txt" 数据输入文件可在此处查看: https://drive.google.com/file/d/18pqILl9myeTRjdiqtExFyOe94Km_aNNM/view?usp=sharing]1
您的 FrameBytes.txt 文件,尽管扩展名实际上是一个 JPG 文件 (除非你在保存时弄乱了它)。
所以,你没有用正确的图像 reader 读取它,而不是字节, 如果您想将其作为图像进行操作。否则,你有 JPEG 编码字节 - 磁盘上的 228140 字节代表一个图像 解压后有 921600 字节的数据。 (这是合理的 高质量的 jpeg 文件)。
只需使用 PIL 即可:
from PIL import Image
img = Image.open("FrameBytes.txt")
print(img.size) # this should print (640, 480).
# to convert it to a numpy array:
import numpy as np
data = np.array(list(img.tobytes()), dtype="uint8")
data.shape = img.size + (3,)
...
如果您不想使用 PIL,当然,您可以使用其他库 - opencv 本身具有开箱即用的 cv2.imread
方法。
你弄得一团糟 - 你应该避免将二进制数据保存为文本文件!
将文件内容复制到剪贴板 - 在 Mac 上,命令是:
cat frame.txt | pbcopy
启动Python并创建一个名为s
的变量并将其设置为剪贴板的内容:
s = PASTE_YOUR_CLIPBOARD
现在做:
from PIL import Image
from io import BytesIO
# Load image from BytesIO
im = Image.open(BytesIO(s))
# Display image and save image
im.show()
im.save('result.png')
如果您使用的是 OpenCV,请使用:
import cv2
# Make s as above
s = PASTE_YOUR_CLIPBOARD
i = np.frombuffer(s,dtype=np.uint8)
im = cv2.imdecode(i,cv2.IMREAD_UNCHANGED)
cv2.imwrite('result.png',im)