我正在使用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),而当我执行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)
附有两种情况的链接。 --capture-movie中的2帧 https://www.dropbox.com/s/3wvyg8s1tflzwaa/frame2out.txt?dl=0
-capture-image-and-download中的字节 https://www.dropbox.com/s/3arozhvfz6a77lr/imageout.txt?dl=0