Opencv 从多个摄像机捕获视频

Opencv capture video from multiple cameras

本文关键字:视频 摄像机 Opencv      更新时间:2023-10-16

我正在验证Opencv 3.4捕获的多个视频,正在使用3个摄像头,笔记本电脑中有一个内置摄像头,2个USB摄像头连接了两个独立的USB端口。我无法使视频捕获发生,它总是抛出异常,因为:

libv4l2: error setting pixformat: Device or resource busy
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline) in cvCaptureFromCAM_GStreamer, file /opt/opencv/modules/videoio/src/cap_gstreamer.cpp, line 890
VIDEOIO(cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index))): raised OpenCV exception:
/opt/opencv/modules/videoio/src/cap_gstreamer.cpp:890: error: (-2) GStreamer: unable to start pipeline in function cvCaptureFromCAM_GStreamer
libv4l2: error setting pixformat: Device or resource busy
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline) in cvCaptureFromCAM_GStreamer, file /opt/opencv/modules/videoio/src/cap_gstreamer.cpp, line 890
VIDEOIO(cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index))): raised OpenCV exception:
/opt/opencv/modules/videoio/src/cap_gstreamer.cpp:890: error: (-2) GStreamer: unable to start pipeline in function cvCaptureFromCAM_GStreamer
cap1 doesn't work

源代码非常简单:

using namespace cv;
int main(int, char**)
{
    VideoCapture cap0(0); // open the default camera
    VideoCapture cap1(1);
    VideoCapture cap2(2);
    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;
    }
    Mat frame0;
    Mat frame1;
    Mat frame2;
    for(;;)
    {
        cap0 >> frame0; // get a new frame from camera
        cap1 >> frame1;
        cap2 >> frame2;
        imshow("Video0", frame0);
        imshow("Video1", frame1);
        imshow("Video2", frame2);
        if(waitKey(30) >= 0) break;
    }
    return 0;
}

所有摄像机均可识别:

crw-rw----+ 1 root video 81, 0  1月 14 09:05 /dev/video0
crw-rw----+ 1 root video 81, 1  1月 14 09:30 /dev/video1
crw-rw----+ 1 root video 81, 2  1月 14 10:11 /dev/video2

我正在使用 Ubuntu 14.04。

知道如何进行多个视频捕获吗?

多个USB相机的第一件事,与OpenCV无关的是USB带宽,它很少支持每个USB端口超过一个相机带宽,建议将每个相机连接到单独的USB端口,而不是USB集线器。

第二件事(我在 Ubuntu 16.04 和 18.04 中的经验;尚未在 Windows 中测试过(某些相机将采用两个索引,这样如果有两个摄像头,您可以尝试为第一个摄像头打开相机索引 0,为第二个摄像头打开相机索引 2:

    VideoCapture camA(0);
    VideoCapture camB(2);

第三,最好控制相机流的 apiPpreferences。例如,要使用 Linux V4L2 并从视频管道中删除 GStreamer,而不是上述方法,请使用以下命令(OpenCV 必须已选择 WITH_CAP_V4L2 构建(:

    VideoCapture camA(0, CAP_V4L2);
    VideoCapture camB(2, CAP_V4L2);