环境:ubuntu18.04 opencv4.4.0
摄像头:usb摄像头,挺老的摄像头,还是usb2.0的
csi摄像头也支持这种方法
插入摄像头后 ls /dev可以看到 /dev/video0
video后面的数字就是后面需要的设备id
代码段摘自opencv手册,基本使用这段代码就够用了
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
Mat frame;
//--- INITIALIZE VIDEOCAPTURE
VideoCapture cap;
// open the default camera using default API
// cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID, apiID);
// check if we succeeded
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
return -1;
}
//--- GRAB AND WRITE LOOP
cout << "Start grabbing" << endl
<< "Press any key to terminate" << endl;
for (;;)
{
// wait for a new frame from camera and store it into 'frame'
cap.read(frame);
// check if we succeeded
if (frame.empty()) {
cerr << "ERROR! blank frame grabbed\n";
break;
}
// show live and wait for a key with timeout long enough to show images
imshow("Live", frame);
if (waitKey(5) >= 0)
break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
API选择
在linux下自然选择v4l2,也可以用CAP_ANY让opencv自己选择,在linux下gstreamer也是基于V4L实现的,所以gstreamer和v4l2都可以。
需要注意的是,在编译opencv时就要把WITH_V4L打勾,好在在默认情况下WITH_V4L是勾选的
enum | cv::VideoCaptureAPIs {
|