• 21992阅读
  • 24回复

关于摄像头视频捕捉 [复制链接]

上一主题 下一主题
离线wc16
 

只看楼主 倒序阅读 楼主  发表于: 2006-03-21
各位大大:
    小弟做了一个摄相头视频捕捉程序,想连续从摄相头来的数据..现在的思路是将摄相头的数据用timer定时读到自己开辟的内存空间中,然后通过image.loadfromdata读出来,然后设置为label背景,label->setPixmap(),但是怎么也显示不出来,我想问问是不是这个思路,和具体的应该用什么控件,和api,请高手指点.....急啊..
[ 此贴被XChinux在2006-03-22 00:29重新编辑 ]
离线fanyu
只看该作者 1楼 发表于: 2006-03-22
用timer一般不行的,正常的都是用多媒体定时器。这个你可以在windows API里找到它。
离线windytwang

只看该作者 2楼 发表于: 2006-03-22
共享内存会更快些immap
离线wc16

只看该作者 3楼 发表于: 2006-03-22
现在就是用mmap做的,只是不知道用什么QT API,显示出来,它必须能从内存中读数据并实时显示...各位大大,给我支点招..
离线asdfqwer
只看该作者 4楼 发表于: 2006-03-23
楼主可否留下邮箱,小弟也想做个关于摄相头视频捕捉方面的设计,有些问题想请教一下,谢谢。
离线obrire

只看该作者 5楼 发表于: 2006-03-23
真是的,LCD驱动有三层,Overlay 1/Overlay 2和FameBuffer
为什么一定要用QT, 就相当于DShow一样,在不同层显示不同应用.还可以支持透明.
我们可以将QT的应用放在FameBuffer(Base Layer)上,而VideoCap的实时内容放
在Overlay2上,这叫回放.而在VideoCap上显示的文字,图标放在Overlay1上呀.
以上三层,包括通道透明处理和灰度处理,都测试通过.
以上便用是商业开发的真正实现.望对诸位有益.
离线obrire

只看该作者 6楼 发表于: 2006-03-23
不仅仅是LCD,所有的FameBuffer驱动,都应当支持这三层.
其实Windows也是这样实现的.
离线wc16

只看该作者 7楼 发表于: 2006-03-24
楼上的肯定是高手,小弟有些不明白了...现在听高手一说,反倒不知道怎么做了,我是要做嵌入式环境的QT应用,不知道高手说的这种办法能不能行得通,能不能再详细点...什么是videocap,是控件,还是库...应该怎么实现..给个具体思路..
离线obrire

只看该作者 8楼 发表于: 2006-03-24
VideoCAP就是V4L提供的Linux下的用于电视(数字/模拟)的接收,存储,发布和PVR/DVR应用内核支持组件.
一般来讲,CCD/CMOS的摄像头也是使用此类接口.电视卡一般采用模拟接入,也可以像Windows下进行数据
采集的.

如果你对系统不了解,只知道库,控件什么的,这比较麻烦.

这需要对整个流程非常熟,以及对RGB/YUV的转换非常了解,才能完成实时视频流捕获/压缩和后处理.

很失望的是,这方面没有现成的控件.如果有,也只能使用驱动直接提供的接口.

至于上面有朋友提到什么timer/mmap,这只是在ioctl时,采用的一种技术.一般采用mmap,但这只能
将数据读出来,但你要知道读出来的是什么颜色,什么格式的数据呀?YUV 4:4:2/RGB 8:8:8?还是其它格式?
各种制式还要适合你的显示设备的制式,你的VGA支持哪种格式?一般是YUV 4:2:2.如果你的LCD/VGA等不
持,显示不出来.如果支持相同格式,按byte读出buffer,直接写入或cat到framebuffer上就可以显示出来了.
至于实时的preview,就是Overlay所支持的回放.打开相应的Overlay层,一个while循环就可了了.

以上便是智能设备视频开发流程的全部.

尽管我有全部的代码,但有可能涉及到商业代码,恕不能提供更多技术支持.

所能支持层:目前有一个家公司提供的产品中,能支持mjpeg/3gp播放,但不能实时codec,而以前我们所工作的
平台,能完全实时3gp实时压缩/RTP发布,支持DivX/Xvid.能让mplayer工作于arm平台,很流畅的进行播放.

首先,能对你提供帮助的是,这与QT没有任何关系.

QT只工作于fb0所支持的Base层.这是三层概念.
Base Layer fb0-->就是你的Qtopia可以显示的平面
Overlay 2     -->就是你要看到效果的平面,用于VideoCapture来的数据流实时显示
Overlay 1     -->就是你的数码相机/手机/PDA上,拍摄时,上面显示的按键/调节提示/文字/时间等
至于QTE,它只负责将GUI数据显示于第一层的内存空间
而Overlay 2是你的显示模块能支持最大的全屏图像数据大小的内存空间
Overlay 1是另一片内存区,比Overlay 2要小,主要用于存储最上层的一此提示数据/图像显示

这三层的实时,与嵌入式与否无关.
如还不清楚,建议你看看Intel中IPP关于图像/视频这部分的内容.
这比较麻烦,我只能帮你到这儿.之所以不清楚,是你对这个流程并不清楚.
就是你将数据读出来了,写到你的QT Label内存区间,是不一定显示正常的.这此数据只是颜色数据
这显相于直接写屏呀.不会引起显示的混乱??
离线obrire

只看该作者 9楼 发表于: 2006-03-24
如果我这儿有开发板,我就做一个DEMO,加一个截图,全面显示出来,你一看就明白了.
离线skly22222

只看该作者 10楼 发表于: 2006-03-24
我做出来了.但前提条件是我知道我的图像是RGB的.
离线hiboy
只看该作者 11楼 发表于: 2006-03-24
引用第10楼skly222222006-03-24 16:08发表的“”:
我做出来了.但前提条件是我知道我的图像是RGB的.


能不能详细的介绍一下方法?学习学习,谢谢
离线windytwang

只看该作者 12楼 发表于: 2006-03-24
太感谢obrire,我也从中受益不少
离线wc16

只看该作者 13楼 发表于: 2006-03-25
非常感谢obrire,我的buffer中的数据是rgb24的,现在用的很苯的方法,先转化为jpg放在硬盘上,然后再设置为背景,一步步的显示出来,效率的确不敢恭维..........obrire,能不能做个demo给我们这些小弟看看..
skly22222是不是也是按照obrire说的方法做出来的,能不能把流程详细的说一下..
离线skly22222

只看该作者 14楼 发表于: 2006-03-26
不过我现在遇到点问题,你们能帮我解决我才能告诉你们.
是这样的,我现在是在QT中调用系统函数dev=open();
然后再调用mmap();为什么我编译出来后它说文件描述出错,难道在QT中不能调用系统函数?
还有一个问题是在QT中嵌入C语言后,C函数传给QT的指针里的地址会不对?
离线skly22222

只看该作者 15楼 发表于: 2006-03-27
问题解决了,呵呵.
原来是我的摄像头坏了,呵呵,真是的
离线wc16

只看该作者 16楼 发表于: 2006-03-29
看了楼上各位老大的方法,将QT调用摄相头的方法公布如下哈:(完成代码,在timeout事件中):
  int x, y;
  int i=0;
  grab(&vd);       //grab为自己实现的读取摄相头数据的程序
  unsigned char *bit= vd.grab_data;
  QImage img;
  QRgb *point;
  int r, g, b;
  if(img.create(320, 240, 32, 0, QImage::IgnoreEndian))
  {
      for(x=0; x<240; x++){
        for(y=0; y<320; y++){
          r=(int)bit[i+2];
            g=(int)bit[i+1];
        b=(int)bit;
        point= (QRgb *)img.scanLine(x)+ y;
        *point = qRgb(r,g,b);
          i+=3;
        }
      }
  }
  paint.begin(this);
  paint.drawImage(0, 0, img);
  paint.end();
离线windytwang

只看该作者 17楼 发表于: 2006-03-30
请问你2.6的内核下能正常显示吗?
离线wc16

只看该作者 18楼 发表于: 2006-03-31
应该没问题,因为这不涉及核心API..
离线windytwang

只看该作者 19楼 发表于: 2006-03-31
但是grab(&vd);     //grab为自己实现的读取摄相头数据的程序
里面要用到v4l啊,而2.6里面开始用v4l2了,我以前2.4可以用的程序到2.6里面就不能正常显示了
因为没看到你grab函数怎么写的,所以不知道你的可以不?
离线wc16

只看该作者 20楼 发表于: 2006-04-01
系统提供什么样的API,你就用什么样的API写.我没用过2.6核心的,如果API有变化,你就跟着改..
离线skly22222

只看该作者 21楼 发表于: 2006-04-06
用不着v4l,去参考一下vidcat里面的getimage函数,把他移植到QT里就行了.
只看该作者 22楼 发表于: 2006-10-31
vidcat不是用的v4l那是用的什么?
其实可以参考qtopia自带的一个图像采集的例子,还有vidcat或者servfox,就是和spca5xx驱动一起的那个
前面那位高人说的很高级,估计要想做产品需要象他那样考虑
哪位知道可以多介绍一下,呵呵
离线hui@jluzh
只看该作者 23楼 发表于: 2010-04-02
瓶颈问题,我也卡在这里
离线xyzh8298
只看该作者 24楼 发表于: 2010-06-03
小弟学习了,现在正在研究中,谢谢各位的思路.
快速回复
限100 字节
 
上一个 下一个