Opencv 从多个摄像机捕获视频
Opencv capture video from multiple cameras
我正在验证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);
相关文章:
- 如何在c++中录制具有精确帧时间戳的视频
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何使用OpenCV-C++编写*.mp4视频?
- 开放 CV 中的动态内存分配,用于视频处理
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 将摄像机调整到俯视图
- 使用mynteye立体声摄像机在ROS中发布左右视频
- Opencv 从多个摄像机捕获视频
- OpenCV噪声消除静态摄像机的视频
- 当我使用RTSP摄像机流时,OpenCV视频贴中滞后
- OPENCV是否可以使用视频捕获设备访问模拟摄像机
- 使用OpenCv和多线程的IP摄像机实时视频馈送
- 物体相对于摄像机和视频的角度?视频和相机输出不同
- 使用 Live555 从连接到 H264 编码器的 IP 摄像机流式传输实时视频
- 使用 OpenCV 从摄像机捕获视频时"Unable to Locate DLL"
- C++/OpenCV流媒体摄像机视频/图像(MJPEG)从套接字进入浏览器(Windows 8.1)
- 来自IP摄像机的MJPEG视频太快
- 从摄像机捕捉视频
- 3摄像机捕获与视频输入或其他任何东西
- 如何将PTAM的视频源更改为IP摄像机?