主题 : tiny6410+2.6.38+usb摄像头问题 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 27835
精华: 0
发帖: 117
金钱: 590 两
威望: 118 点
综合积分: 234 分
注册时间: 2010-09-01
最后登录: 2017-06-22
楼主  发表于: 2011-12-12 12:40

 tiny6410+2.6.38+usb摄像头问题

调了好长一段时间摄像头,开始使用v4l2方式直接采集,qt label显示,发现怎么也过不去,一直报VIDIOC_QUERYBUF的错误,跑了很久论坛,也改了内核v4l2-ioctl.c的代码,但还是不行,后来才知道usb是video2,我一直用的video0是cmos,也就是说如果用usb的video2,应该和http://www.aiothome.net/read.php?tid-11869-fpage-0-toread--page-2.html帖子里面说的关系不大的。
可是改了后,又出现segmentation fault问题,就暂时放弃了,转用opencv直接采集,移植好后,采集正常,但图像太小,只有160*120,因为后面图像处理也可以,所以没在意。
现在重新回来调v4l2采集usb的,仔细追踪,开始发现是在yuyv转rgb的过程中segmentation fault了,程序中for转换的大小是 width*height*2,如果是640*480*2=614400,但实际上只能做到40960就过不去了,改成小于40960可以显示,但是图像明显转换的不对,显示的图像是被压缩的,这就奇怪了,如果说只转换了一部分,那应该只显示一部分,而不应该是压缩的,仔细检查转换的程序,又自己建了一个原图做转换,没有出现segmentation fault,证明yuyv转rgb城区没有问题。
现在问题就出在v4l2的原图指针p的数据长度,重新进入get_frame函数(获取图像),追踪了一下数据长度,发现返回的只有38400,算了一下是160*120*2,这时候对照opencv直接采集时出现的问题,发现mmap默认的返回图像数据长度应该就是38400.
为什么会这样了?整个v4l2操作部分仔细查看都没有问题,也查了很多其他人的,都一样是这个问题,那么现在http://www.aiothome.net/read.php?tid-11869-fpage-0-toread--page-2.html帖子里面说的内核问题应该是针对所有的使用capture方式mmap采集图像的摄像头都有的问题,但为什么有人能通了?
想问一下这个问题究竟是友善的2.6.38内核v4l2驱动问题,还是什么其他原因了,似乎不是6410芯片的板子都能行了。

级别: 侠客
UID: 27835
精华: 0
发帖: 117
金钱: 590 两
威望: 118 点
综合积分: 234 分
注册时间: 2010-09-01
最后登录: 2017-06-22
1楼  发表于: 2011-12-12 12:44

 回 楼主(langqiong) 的帖子

补充一下:get_frame函数中VIDIOC_DQBUF返回的长度是38400,init_mmap函数VIDIOC_REQBUFS也是38400,但是在虚拟机上一直没有问题,返回的都是640*480*2=614400,显示正常
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
2楼  发表于: 2011-12-12 13:26
usb摄像头和cpu无关,主要和内核版本有关
并且这个驱动是内核自带的
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 侠客
UID: 27835
精华: 0
发帖: 117
金钱: 590 两
威望: 118 点
综合积分: 234 分
注册时间: 2010-09-01
最后登录: 2017-06-22
3楼  发表于: 2011-12-12 17:05

 回 2楼(mindee) 的帖子

谢谢版主解答。
也问了网上其他开发版的用户,使用38内核没什么问题,可能是做过修改。
那现在确定是内核问题了?
如果是的话,是否按照http://www.aiothome.net/read.php?tid-11869-fpage-0-toread--page-2.html所说修改就行了,实际我也按照帖子所说改了后重新make了一个内核,但是一样还是不行。
现在只好把采集的图像大小改为160*128,因为原先的160*120中的120不是16的倍数,导致v4l2的配置操作过不去,图像倒是出来了,只是太小。
还有一个问题,返回的图像长度跟踪了一下是38400,应该是160*120*2,但是yuyv转换的时候却可以转换40960,刚好是160*128*2的值,所以导致图像最下面是花的,什么原因了?不得其解。还是说转换的时候限定长度就直到38400就行了,多的不要了。
[ 此帖被langqiong在2011-12-12 18:07重新编辑 ]
级别: 侠客
UID: 27835
精华: 0
发帖: 117
金钱: 590 两
威望: 118 点
综合积分: 234 分
注册时间: 2010-09-01
最后登录: 2017-06-22
4楼  发表于: 2011-12-12 17:07

 回 3楼(langqiong) 的帖子

改回v4l2采集图像是160*128,转换和显示是160*120,图像出来完整了,没有了最下面的花屏。但实在太小
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
5楼  发表于: 2011-12-12 17:25

 回 3楼(langqiong) 的帖子

有没有修改,对照www.kernel.org下载的版本对比一下就知道了。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 新手上路
UID: 101066
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2014-03-01
最后登录: 2017-09-13
6楼  发表于: 2014-03-01 22:40
请问一下 OPENCV 移植后摄像头可以用?
为什么我往210的板子上移植后,无法打开摄像头。。。现在很纠结, 不知如何图像采集了
请问楼主 opencv的版本,

还有就是如何用v4l2采集图像呢, 他可以转化成 opencv的 IplImage的格式吗,非常感谢, 这对我来说很重要呀!