weiyanan11 发表于 2014-8-26 18:27:41

S3C6410 UVC摄像头显示咨询

各位好:
       由于项目需求,需要在6410开发板上实现二维码扫描功能,采用了一款UVC摄像头。使用V4L2操作摄像头,图像格式是MJPEG,分辨率是352*288,开始的时候直接使用QImage的Loadfromdata()方法读取帧的字节流,然后把QImage显示到界面上,同时在后台使用QZXing解析相应的QImage。实际中发现CPU一直满负荷运行,界面显示非常不流畅。感觉是Loadfromdata()方法和QZXing解码过程比较耗时。
       后来看了luvcview的摄像头测试工具,是直接把摄像头的数据流写入到s3c-pp文件中,也尝试修改了luvcview源代码,使其显示分辨率是352*288,但是显示区域显示图像很正常,没有用到的区域是一片黑色。我想直接在Qt中实现相应的显示方式,开一个小窗口显示视频流,下面还有Qt的Button可以控制别的操作。请问应该怎么做,谢谢大家了!

─╄OvЁ等待 发表于 2014-8-27 14:30:04

luvcview是不是用到了硬件解码器? 你要是能在qt里整合luvcview的代码最好;之前见过一个广告机的程序是通过mplayer+qt方式实现的, 不行的话也可以参考这种简单的方式试试,

weiyanan11 发表于 2014-8-27 16:29:51

─╄OvЁ等待 发表于 2014-8-27 14:30 static/image/common/back.gif
luvcview是不是用到了硬件解码器? 你要是能在qt里整合luvcview的代码最好;之前见过一个广告机的程序是通 ...

首先谢谢你哥们,等了一天终于有个人回复了;
luvcview的程序是通过S3C_PP使用OSD的方式输出到屏幕上,总是有很大一部分黑屏;我现在尝试直接把luvcview解码mjpeg后的的格式直接输出到fb0映射到的内存上,但是转换的格式总是2倍(比如说,我设置的摄像头分辨率是352*288,而解码mjpeg后的数据量是352*288*2)。我试了下循环把解码后的数据一个个的输出到fb0映射的内存中去,图像不太正确。代码如下:
int h=0;
int w=0;
for(h=0;h<videoIn->height;h++)
{
        for(w=0;w<videoIn->width*2;)
        {
                dest = videoIn->framebuffer[(h*videoIn->width+w++)] << 8 | videoIn->framebuffer[(h*videoIn->width+w++)];
        }
        dest += 800;
}我的屏幕分辨率是800*600,framebuffer是转换mjpeg之后的数据,大概错误之处就是每个像素点占用两个字节,我怎么样把framebuffer的字节拼成想要的数据呢?谢谢了!

─╄OvЁ等待 发表于 2014-8-28 08:32:02

weiyanan11 发表于 2014-8-27 16:29 static/image/common/back.gif
首先谢谢你哥们,等了一天终于有个人回复了;
luvcview的程序是通过S3C_PP使用OSD的方式输出到屏幕上,总 ...

你说的这些是不是跟你没有调整好数据的位数有关?我这两天在搞uboot读取bmp图片显示,遇到的问题也是bmp数据显示到frambuffer不正常,后来发现是bmp图片的数据位数跟frambuffer的指针位数不一致,你的数据是352x288x2,应该是16位565的数据,你在写入到fb0时是不是应该使用16位的指针呢?

weiyanan11 发表于 2014-8-28 10:53:09

─╄OvЁ等待 发表于 2014-8-28 08:32 static/image/common/back.gif
你说的这些是不是跟你没有调整好数据的位数有关?我这两天在搞uboot读取bmp图片显示,遇到的问题也是bm ...

首先谢谢你。
我是直接把framebuffer的连续两个做解析然后拼成一个16位的数据放到fb0的一个位置;大致代码如下:char low = framebuffer;
char high = framebuffer;
char red = high & 0xf8;
char green = (high & 0x7) | (low & 0xe0);
char blue = low & 0x1f;
short color16 = blue | (green << 5) | (red << (5+6));然后直接把color16放在fb0的第一个点的为止,下面以此类推。看到的图像能大致看到轮廓,但是图像还是不正确。

weiyanan11 发表于 2014-8-31 15:37:32

感谢各位的回复。经过几天的尝试算是比较满意的解决了该问题,显示和解码都能达到较好的效果。采用的是直接把摄像头出来的数据(我的摄像头是MJPEG格式的)经过libjpeg库解码之后直接显示到fb0映射的内存中。后台开一个线程解析QImage即可。借鉴了一个比较好的例子https://github.com/joeshang/joycar/tree/master/module/v4l2_camera
页: [1]
查看完整版本: S3C6410 UVC摄像头显示咨询