我正在使用一个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
目前没有回答
相关问题 更多 >
编程相关推荐