python-3.x - 将图像字节数据流解码为 JPEG
问题描述
我正在努力成功地从字节解码 JPEG 图像,然后再次返回 JPEG。
我从 MJPG 字节流中的编码帧开始,我想对其进行解码以便使用 OpenCV 进行操作。我是 Python、numpy、opencv 等的新手!
我现在将文本文件中的帧 JPG 数据保存为: b'\xf\xd8\xff\xdb\x00..etc 等用于测试目的:
当我尝试在第 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 馈送中捕获的,但由于某种原因,在编码过程中大小发生了变化?这就是我目前所能想到的。欢迎任何/所有帮助。
我已经查看了一篇相关文章:Python - byte image to NumPy array using OpenCV but trying to avoid PIL,并且 frombuffer 方法对我来说似乎也失败了。
好的,所以我取得了一些进展,现在有:
npFlat = np.frombuffer(MyBytes.encode('utf-8'),dtype=np.int8).
当我将 npFlat 重塑为 (374, 610) 时,我现在也可以让代码成功。也就是说,374 x 610 = 长度为 228140 的平面 numpy 数组……但这一切似乎都很奇怪。缓冲区信息代表我正在尝试重新打开的 JPG……但还没有接近。
MyBytes.txt" 数据输入文件可在此处查看: https://drive.google.com/file/d/18pqILl9myeTRjdiqtExFyOe94Km_aNNM/view?usp=sharing] 1
解决方案
你搞得一团糟——你应该避免将二进制数据保存为文本文件!
将文件的内容复制到剪贴板 - 在 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)
推荐阅读
- spring - 当我在 docker 中运行时,为什么 localhost 拒绝提供连接?
- ruby - Ruby:在屈服期间,谁是块内的自我?
- python - 在错误的目录中创建/保存文件夹
- python - 为什么 .append() 在 PyCharm 中给出“预期语句结束”错误?
- fortran - Fortran 编译器是否强制或假定 PURE 关键字为真?
- svg - 如何制作我的 svg 图像圆,该圆目前是正方形,半径为无聊
- filter - 在 weka 中为由数字和字母组成的 id 选择什么过滤器
- sql-server - MS SQL Server - 复制数据库的初始数据匿名化
- spring-boot - Kafka 消费者 LeaveGroup 请求协调器
- javascript - 谷歌开发人员的 Puppeteer 代码是否有问题:custom-event.js?