簡體   English   中英

Opencv從多個攝像機捕獲視頻

[英]Opencv capture video from multiple cameras

我正在驗證Opencv 3.4的多個視頻捕獲,正在使用3個攝像頭,筆記本電腦中的一個內置攝像頭,兩個連接兩個獨立的USB端口的2個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,然后為攝像機索引第二個:

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

第三,優良作法是控制攝像機流的apiPreference。 例如,要使用Linux V4L2並從視頻管道中刪除GStreamer,請使用以上方法(必須已選擇WITH_CAP_V4L2構建了OpenCV):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM