通过读取Python中Popen的字节输入将MJPEG转换为JPEG

2024-09-29 18:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个windows版本的gphoto2生成一个字节流。获取字节流并查找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)的内容,而当我从我得到的字节字符串(140000,)中读取它时,我会报告类似(140000,1)的内容。我试着扩展维度,但没有成功

编辑2: 我意识到mjpeg的头不仅仅是一个标准的jpeg头。我不知道如何将其转换为标准格式。如果有人有什么建议那就太好了

编辑3: 我简化了输出并写入文件代码,以便只读取管道数据

我有两个测试用例,一个是我使用的——捕获电影2,另一个是我使用的——捕获图像并下载,这样在第一个用例中我捕获了2帧MJPEG数据,另一个是我捕获了1帧jpeg数据。我试图用我以前的代码显示这两种情况下的数据,但它们无法显示图像,即使我只是等待标准输出完成,而不是实时读取数据

下面是我用来将字节写入字节文件的代码。在我之前的评论中,我只是记录了一个print语句中的字节字符串(我知道我在这方面不是很在行)。应该注意的是,我认为这些字节串需要解码

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帧 https://www.dropbox.com/s/3wvyg8s1tflzwaa/frame2out.txt?dl=0

字节从--捕获图像并下载 https://www.dropbox.com/s/3arozhvfz6a77lr/imageout.txt?dl=0


Tags: 数据字符串图像if字节npstdoutsp

热门问题