Opencv从多个摄像头捕获视频

时间:2018-01-14 08:41:28

标签: c++ opencv

我正在通过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。

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

1 个答案:

答案 0 :(得分:0)

具有多个USB摄像头且与OpenCV不相关的第一问题是USB带宽,每个USB端口很少支持一个摄像头带宽,因此建议将每个摄像头连接到一个单独的USB端口,而不是USB集线器。

第二次(我在Ubuntu 16.04和18.04上的经验;尚未在Windows中进行测试)的第二件事是,某些相机会采用两个索引,例如,如果有两个相机,则可以尝试打开相机第一个摄像机的索引为0,第二个摄像机的索引为2:

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

第三,优良作法是控制摄像机流的apiPreference。例如,要使用Linux V4L2并从视频管道中删除GStreamer,请使用以上方法(必须已选择WITH_CAP_V4L2构建了OpenCV):

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