我正在通过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。
知道如何进行多个视频捕获吗?
答案 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);