OpenCV 3.2 在抓取时提供选择超时,但 fscyber 可以工作
OpenCV 3.2 gives Select Timeout when grabbing, but fswebcam works
我在这里遇到了一个奇怪的问题。 简而言之,我试图从相机(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编辑也能正常工作,并查看重新启动后是否有任何性能差异。没有;)
- C++减少modbus_connect超时
- 没有超时的C++条件变量
- 如何在C++(VS2010)中设置超时读取USB端口?
- C++卷曲柱在curl_easy_perform超时
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- C++:函数外部的超时功能
- 使用boost::multiprecision cpp_int左移时出现超时错误
- QTimer 超时不会在单元测试中触发
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 超时后,线程睡眠不会继续执行
- 接受超时的 TCP 连接
- 为 g++ build 设置超时,为 Sublime Text 运行?
- 如何通过命令行工具在 COIN-OR Cbc 中设置超时?
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- 0作为std::condition_variable::wait_fo中的超时
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 使用 alarm() 实现进程超时
- OpenCV 3.2 在抓取时提供选择超时,但 fscyber 可以工作