[英]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.