调了好长一段时间摄像头,开始使用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芯片的板子都能行了。