OpenCV 3.2 在抓取时提供选择超时,但 fscyber 可以工作

OpenCV 3.2 gives Select Timeout when grabbing, but fswebcam works

本文关键字:超时 fscyber 工作 选择 抓取 OpenCV      更新时间:2023-10-16

我在这里遇到了一个奇怪的问题。 简而言之,我试图从相机(Mercury 2.0 网络摄像头嵌入式摄像头)中抓取帧,但它没有按预期进行。

我正在 BeagleBone Black 上运行 Debian Jessie。 我已经安装了OpenCV 3.2并对其进行了测试,我的视觉算法在imread()中工作正常,所以是时候开始使用相机了。 我遇到的第一个问题是相机在 Ubuntu 16.04 中无法正常工作。所以我切换到 Debian Jessie,现在我可以像预期的那样在几分之一秒内使用 fscyber(fswebcam -r 1600x1200 --jpeg 95 -D 0 test.jpg)抓取 1600x1200 帧。

当它起作用时,我很高兴,所以现在我又开始变得相当烦躁,因为 VideoCapture>> Mat 无法按预期工作。 不过,如果我将分辨率设置为 800x600,它就可以正常工作。 当我将分辨率设置为 1600x1200 时,它首先给我选择超时,但随后立即获得成功的结果。 因此,它能够抓住框架,但不是第一次尝试。在我看来,这是一个时间问题。所以我尝试使用 grab() 和 retrieve(),但这似乎也无济于事。

还有其他人对此问题有一些好的想法/建议/提示或经验吗?

一些规格:

$ uname -a
Linux arm 4.9.13-bone4 #1 [date] armv7l GNU/Linux
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
$ v4l2-ctl --all 
Driver Info (not using libv4l2): 
Driver name: uvcvideo 
Card type: Mercury USB2.0 Camera 
Bus info: usb-musb-hdrc.1.auto-1.1 
Driver version: 4.9.13
$ fswebcam -r 1600x1200 --jpeg 95 -D 0 test.jpg
Opening /dev/video0
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Capturing frame...
Captured frame in 0.00 seconds.
Processing captured image...
Setting output format to JPEG, quality 95
Writing JPEG image to 'test.jpg'.

基本代码功能

VideoCapture cam(0);
cam.set(CAP_PROP_FRAME_WIDTH,width);
cam.set(CAP_PROP_FRAME_HEIGHT,height);
/*check cam.isOpened()*/
/*echo some camera properties*/
if(cam.grab()) cam.retrieve(frame);
imwrite(filename, frame);
cam.release();

另外,我尝试了:

modprobe uvcvideo nodrop=1 timeout=6000

但这并没有帮助... 我也尝试使用旧的 CvCapture 类,但这也没有帮助。

整天都在努力工作,并想出了一些额外的事情: BeagleBone似乎很难插入和拔出USB设备。我想检查我拍的照片,所以我插入我的USB闪存驱动器,安装它,卸载它,取出它,欣赏照片。然后相机将不再工作,即使使用fswebcam也是如此。必须重新启动才能使其再次工作。

此外,使用 fscyber 连续拍摄几张 2MP 照片以快速拍摄,似乎也会出现问题。有时我可以拍几张照片,有时只需要 1 张照片,然后我需要再次重新启动。当我不能拍摄 2MP 照片时,我仍然可以拍摄 800x600 张照片。 简单地重新插入 USB 无济于事。

对于处理相同问题的每个人(选择超时)。我为我的情况修复了它,我不知道这是否对每个人都有用,但如果这对其他人有帮助,我会很高兴。

问题可能是因为您尝试使用的相机仅与半UVC兼容。UVC 熟悉作为 UVC 兼容的产品出售,而实际上并非如此。所以他们添加了一种叫做怪癖的东西。 在此处阅读更多相关信息: UVC 常见问题

解答那么,如何解决选择超时?嗯,显然很容易。 首先,我们关闭 uvcvideo 模块

rmmod uvcvideo

接下来,我们再次启用它,但启用了带宽怪癖;以防万一,还要添加nodrop和超时标志。

modprobe uvcvideo quirks=128 nodrop=1 timeout=6000

如果希望解决方案在重新启动后正常工作,请将这两行添加到.bash_profile

在此修复后,我用USB2.0相机测试了BeagleBone Black: 平均帧率:4(高度依赖光线,在较暗的环境中获得 5 FPS) 平均错误百分比:2.4%(2000 read() 的 1953 张成功图片)

通过循环抓取 100 帧并执行此操作 20 次进行测试。我在 10 点后重新启动,以确保我的.bash_profile编辑也能正常工作,并查看重新启动后是否有任何性能差异。没有;)