嵌入式爱好者

查看: 16912|回复: 5

[Linux] S3C6410 UVC摄像头显示咨询

[复制链接]
回帖奖励 29 回复本帖可获得 1 奖励! 每人限 1 次

6

主题

12

帖子

32

积分

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

使用道具 举报

7

主题

160

帖子

242

积分

发表于 2014-8-27 14:30:04 | 显示全部楼层

回帖奖励 +1

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

点评

首先谢谢你哥们,等了一天终于有个人回复了; luvcview的程序是通过S3C_PP使用OSD的方式输出到屏幕上,总是有很大一部分黑屏;我现在尝试直接把luvcview解码mjpeg后的的格式直接输出到fb0映射到的内存上,但是转换的  详情 回复 发表于 2014-8-27 16:29
点评回复 支持 反对

使用道具 举报

6

主题

12

帖子

32

积分

 楼主| 发表于 2014-8-27 16:29:51 | 显示全部楼层
─╄OvЁ等待 发表于 2014-8-27 14:30
luvcview是不是用到了硬件解码器? 你要是能在qt里整合luvcview的代码最好;  之前见过一个广告机的程序是通 ...

首先谢谢你哥们,等了一天终于有个人回复了;
luvcview的程序是通过S3C_PP使用OSD的方式输出到屏幕上,总是有很大一部分黑屏;我现在尝试直接把luvcview解码mjpeg后的的格式直接输出到fb0映射到的内存上,但是转换的格式总是2倍(比如说,我设置的摄像头分辨率是352*288,而解码mjpeg后的数据量是352*288*2)。我试了下循环把解码后的数据一个个的输出到fb0映射的内存中去,图像不太正确。代码如下:

  1. int h=0;
  2. int w=0;
  3. for(h=0;h<videoIn->height;h++)
  4. {
  5.         for(w=0;w<videoIn->width*2;)
  6.         {
  7.                 dest[w/2] = videoIn->framebuffer[(h*videoIn->width+w++)] << 8 | videoIn->framebuffer[(h*videoIn->width+w++)];
  8.         }
  9.         dest += 800;
  10. }
复制代码
我的屏幕分辨率是800*600,framebuffer是转换mjpeg之后的数据,大概错误之处就是每个像素点占用两个字节,我怎么样把framebuffer的字节拼成想要的数据呢?谢谢了!

点评

你说的这些是不是跟你没有调整好数据的位数有关? 我这两天在搞uboot读取bmp图片显示,遇到的问题也是bmp数据显示到frambuffer不正常,后来发现是bmp图片的数据位数跟frambuffer的指针位数不一致, 你的数据是352x  详情 回复 发表于 2014-8-28 08:32
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

7

主题

160

帖子

242

积分

发表于 2014-8-28 08:32:02 | 显示全部楼层
weiyanan11 发表于 2014-8-27 16:29
首先谢谢你哥们,等了一天终于有个人回复了;
luvcview的程序是通过S3C_PP使用OSD的方式输出到屏幕上,总 ...

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

点评

首先谢谢你。 我是直接把framebuffer的连续两个做解析然后拼成一个16位的数据放到fb0的一个位置;大致代码如下:然后直接把color16放在fb0的第一个点的为止,下面以此类推。看到的图像能大致看到轮廓,但是图像还是  详情 回复 发表于 2014-8-28 10:53
点评回复 支持 反对

使用道具 举报

6

主题

12

帖子

32

积分

 楼主| 发表于 2014-8-28 10:53:09 | 显示全部楼层
─╄OvЁ等待 发表于 2014-8-28 08:32
你说的这些是不是跟你没有调整好数据的位数有关?  我这两天在搞uboot读取bmp图片显示,遇到的问题也是bm ...

首先谢谢你。
我是直接把framebuffer的连续两个做解析然后拼成一个16位的数据放到fb0的一个位置;大致代码如下:
  1. char low = framebuffer[0];
  2. char high = framebuffer[1];
  3. char red = high & 0xf8;
  4. char green = (high & 0x7) | (low & 0xe0);
  5. char blue = low & 0x1f;
  6. short color16 = blue | (green << 5) | (red << (5+6));
复制代码
然后直接把color16放在fb0的第一个点的为止,下面以此类推。看到的图像能大致看到轮廓,但是图像还是不正确。
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

6

主题

12

帖子

32

积分

 楼主| 发表于 2014-8-31 15:37:32 | 显示全部楼层
感谢各位的回复。经过几天的尝试算是比较满意的解决了该问题,显示和解码都能达到较好的效果。采用的是直接把摄像头出来的数据(我的摄像头是MJPEG格式的)经过libjpeg库解码之后直接显示到fb0映射的内存中。后台开一个线程解析QImage即可。借鉴了一个比较好的例子https://github.com/joeshang/joycar/tree/master/module/v4l2_camera
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-4-12 13:26

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表