OpenCV 3.4多摄像头采集失败求助:Ubuntu14.04设备占用报错
我来帮你排查这个多摄像头采集的问题,结合你给出的错误信息和环境,大概率是GStreamer后端兼容性、USB带宽限制或者设备占用的问题,试试下面这些分步解决方案:
1. 强制切换到V4L2视频捕获后端
你的错误日志明确指向GStreamer管道启动失败,Ubuntu 14.04自带的GStreamer版本和OpenCV 3.4的兼容性确实容易出问题。可以直接指定用V4L2后端打开摄像头,绕开GStreamer的坑。
修改你的初始化代码,加上后端参数,同时建议降低摄像头分辨率(减少带宽压力):
using namespace cv; int main(int, char**) { // 强制使用V4L2后端初始化摄像头 VideoCapture cap0(0, CAP_V4L2); VideoCapture cap1(1, CAP_V4L2); VideoCapture cap2(2, CAP_V4L2); if(!cap0.isOpened()) { std::cout << "cap0 doesn't work" << std::endl; return -1; } if(!cap1.isOpened()) { std::cout << "cap1 doesn't work" << std::endl; return -1; } if(!cap2.isOpened()) { std::cout << "cap2 doesn't work" << std::endl; return -1; } // 统一降低分辨率,减少USB带宽占用 cap0.set(CAP_PROP_FRAME_WIDTH, 640); cap0.set(CAP_PROP_FRAME_HEIGHT, 480); cap1.set(CAP_PROP_FRAME_WIDTH, 640); cap1.set(CAP_PROP_FRAME_HEIGHT, 480); cap2.set(CAP_PROP_FRAME_WIDTH, 640); cap2.set(CAP_PROP_FRAME_HEIGHT, 480); Mat frame0; Mat frame1; Mat frame2; for(;;) { cap0 >> frame0; cap1 >> frame1; cap2 >> frame2; imshow("Video0", frame0); imshow("Video1", frame1); imshow("Video2", frame2); if(waitKey(30) >= 0) break; } return 0; }
注:如果是源码编译的OpenCV 3.4,默认已经开启V4L2支持;如果是apt安装的,确保安装了libopencv-videoio-dev包。
2. 排查USB带宽瓶颈
多个USB摄像头同时工作很容易触发USB控制器的带宽上限,尤其是当它们共享同一个USB集线器时。
- 先查看USB设备拓扑结构,确认摄像头的连接情况:
如果两个USB摄像头在同一个根集线器下,尝试把其中一个插到主板上的另一个USB端口(比如换USB2.0/3.0接口,或者不同控制器的端口)。lsusb -t - 除了降低分辨率,还可以进一步限制帧率:
cap0.set(CAP_PROP_FPS, 20); cap1.set(CAP_PROP_FPS, 20); cap2.set(CAP_PROP_FPS, 20);
3. 检查摄像头是否被其他进程占用
错误信息里的Device or resource busy提示,可能是目标摄像头已经被系统应用(比如Cheese)、测试工具或其他进程占用了。
- 用
fuser命令查看占用/dev/video1的进程:sudo fuser /dev/video1 - 如果有输出,用
kill命令结束对应的进程,再重新运行你的程序。
4. 单独测试单个摄像头定位问题
先逐个验证摄像头的可用性,排除单个设备的驱动或硬件问题:
- 修改代码只测试cap1:
using namespace cv; int main(int, char**) { VideoCapture cap1(1, CAP_V4L2); if(!cap1.isOpened()) { std::cout << "cap1 doesn't work" << std::endl; return -1; } cap1.set(CAP_PROP_FRAME_WIDTH, 640); cap1.set(CAP_PROP_FRAME_HEIGHT, 480); Mat frame1; for(;;) { cap1 >> frame1; imshow("Video1", frame1); if(waitKey(30) >= 0) break; } return 0; } - 如果单独打开也失败,用
v4l2-ctl工具测试底层驱动:
如果这个命令也报错,可能是摄像头驱动和Ubuntu 14.04的老内核不兼容,建议尝试升级内核到4.x版本。sudo apt-get install v4l-utils v4l2-ctl --device=/dev/video1 --stream-mmap --stream-to=/dev/null --stream-count=100
内容的提问来源于stack exchange,提问作者Rui Huang
相关产品推荐
相关产品推荐

