minigui/mgncs:利用LoadBitmapFromMem函数对摄像头MJPEG格式图像解码

可能与虚拟机有关,在virtualbox虚拟机环境下,即使设置了为RGB或YUV,通过v4l2视频驱动框架读取摄像头帧图像的格式总是MJPEG。
MJPG是什么格式下说明摘自百度百科:

说白了,就是把视频的每一帧压缩成一个JPEG格式的图像。也就是说每一帧都是一个独立完整的JPEG,把它存成后缀为或的文件,就可以用任意看图软件打开了。
所以对于MJPEG格式的视频,解码也不麻烦,只要把它当JPEG图像解码就好了。

minigui库中正好有函数用于对内存图像数据(bmp,png,jpg)解码,只要调用它,就可以直接将一帧图像转为,然后设置为窗口的背景(mWidget的属性),就可以实现视频在窗口中的显示了,完美!

大致的解码片段就是酱紫:

判断开始两个字节是否为JPEG格式的魔数FFDB,这个没有错,但问题是根据JPEG标准的定义,接下来的判断就限定了只认JFIF和Exif两个格式,就不对了,Exif和JFIF格式是被广泛使用的JPEG的文件存储格式,但由此限定JPG只有这两种格式就狭隘了。
MJPEG格式属于视频流就没有文件存储定义,所以可以没有Exif和JFIF标记。
我收到的MJPEG帧图像就没有这个标记,不同的设备表现还不同,台式机上用的摄像头收到的MJPEG帧
开始2个字节FFD8后直接就是FFC0(SOFO,Start Of Frame, 帧图像开始)标记,所以在这一步 错了。
而在笔记本内置的摄像头上收到数据如下:(2,3字节为FFE0,6,7,8,9为AVI1)

这里写图片描述
找到问题原因解决办法就很简单,删除源码中这个判断语句重新编译就OK

另外在函数中也是同样的判断逻辑,处理办法一样,一并修改掉。

《c/c++:判断数据(stream)是否为JPEG图像快速而准确的方法》

参考资料

《JPEG文件格式 JFIF & Exif》
《JPEG文件格式介绍》

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年7月25日
下一篇 2018年7月25日

相关推荐