首页 > 解决方案 > 通过在 Python 中从 Popen 读取字节输入将 MJPEG 转换为 JPEG

问题描述

我正在使用 gphoto2 的 Windows 构建来生成字节流。获取字节流并查找 jpeg 标头 (ff d8) 和页脚 (ff d9) 并显示流中的单个图像。每当我将解析的字节字符串传递给 imdecode 时,它​​都会返回 None。我将包括 ff d8/ff d9 在内的所有数据传递到 imdecode 中。

pipe = sp.Popen('gphoto2 --stdout-size --capture-movie', stdout = sp.PIPE)
founda=False
foundb=False
bytesl=b''
while True:
    bytesl=bytesl+pipe.stdout.readline()
    if ~founda:
        a = bytesl.find(b'\xff\xd8') # JPEG start
        bytesl = bytesl[a:]
        if a!=-1:
            founda=True
    if founda and ~foundb:
        b = bytesl.find(b'\xff\xd9') # JPEG end
        if a!=-1 and b!=-1:
            foundb=True
    if founda and foundb:
        jpgi = bytesl[:b+2]
        imfbuffh = cv2.imdecode(np.frombuffer(jpgi, dtype=np.uint8),cv2.IMREAD_COLOR)

我一直从 imdecode 中一无所获,我不知道为什么。字节字符串似乎可以正确解析数据。任何帮助将不胜感激。

编辑:我注意到的其他事情是,如果我只是从文件中读取 JPG 并且我对来自 np.buffer 的对象执行 np.shape 我报告类似 (140000,1) 的内容,而不是当我执行 np.shape 时我正在从我得到的字节字符串(140000,)中读取它。我试过扩大尺寸,但没有奏效。

Edit2:嗯,我意识到 mjpeg 的标头不仅仅是标准的 jpeg 标头。我不确定如何将其转换为标准格式。如果有人有任何提示,那就太好了。

Edit3:我简化了输出并写入文件代码以读取管道数据。

我有两个测试用例,一个使用--capture-movie 2,一个使用--capture-image-and-download,这样在第一种情况下我捕获2帧MJPEG数据,另一个我捕获1帧jpeg 数据。我尝试使用我之前的代码显示这两种情况的数据,即使我只是等待标准输出完成而不是实时读取数据,它们也无法显示图像。

这是我用来将字节写入字节文件的代码。在我之前的评论中,我只是记录了打印语句中的字节字符串(愚蠢的我知道我不擅长这个)。应该注意我认为这些字节串需要解码。

pipe = sp.Popen('gphoto2 --stdout-size --capture-movie 2', stdout = sp.PIPE)
pipedata=pipe.stdout.read()
f = open('C:\\Users\\Work\\frame2out.txt', 'wb')
f.write(pipedata)

附件是两个案例的链接。2 帧来自 --capture-movie https://www.dropbox.com/s/3wvyg8s1tflzwaa/frame2out.txt?dl=0

来自 --capture-image-and-download https://www.dropbox.com/s/3arozhvfz6a77lr/imageout.txt?dl=0的字节

标签: pythonopencvmjpeglibgphoto2

解决方案


推荐阅读