You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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设备拓扑结构,确认摄像头的连接情况:
    lsusb -t
    
    如果两个USB摄像头在同一个根集线器下,尝试把其中一个插到主板上的另一个USB端口(比如换USB2.0/3.0接口,或者不同控制器的端口)。
  • 除了降低分辨率,还可以进一步限制帧率:
    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工具测试底层驱动:
    sudo apt-get install v4l-utils
    v4l2-ctl --device=/dev/video1 --stream-mmap --stream-to=/dev/null --stream-count=100
    
    如果这个命令也报错,可能是摄像头驱动和Ubuntu 14.04的老内核不兼容,建议尝试升级内核到4.x版本。

内容的提问来源于stack exchange,提问作者Rui Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:23