关于OpenCV和VS2019的配置,请参考博客以前的连接。
OpenCV中主要使用videocapture来打开和关闭摄像头
https://docs.opencv.org/master/d8/dfe/classcv_1_1VideoCapture.html#afb4ab689e553ba2c8f0fec41b9344ae6
上述连接时OpenCV官网对于这个类的功能描述
定义
class cv::VideoCapture
构造函数,有三种
//功能:创建一个VideoCapture类的实例,如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。
cv::VideoCapture::VideoCapture()
cv::VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY) //filename – 打开的视频文件名。
cv::VideoCapture::VideoCapture(int index,int apiPreference = CAP_ANY) //index – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像。
//后面两个参数可以不用管它
摄像头打开与关闭
virtual bool isOpened () const //视频成功初始化,返回true
virtual bool open (const String &filename)//通过video capturing打开视频文件或摄像头
virtual bool open (int index) //通过摄像头打开视频,默认为0,如果是带前置摄像头的电脑,一般为前置摄像头。
但实际使用时,如下:
VideoCapture capture;//初始化一个VideoCapture实例,名字叫做capture
capture.open("111.avi");//利用初始化的capture,打开视频"dog.avi"
capture.open(0);//利用初始化的capture,打开ID为0的摄像头,一般有前置摄像头的笔记本电脑,默认打开该摄像头。
capture.release();//关闭视频文件或者摄像头
不过我建议使用最多的方式如下:
VideoCapture capture(0);//初始化一个VideoCapture实例,名字叫做capture,并打开设备0的摄像头
读取视频帧
VideoCapture& VideoCapture::operator>>(Mat& image);
bool VideoCapture::read(Mat& image);//该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧。假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
我建议使用如下方式:
Mat frame;//定义同一个mat变量,用来接收一帧图像
capture >> frame;//利用>>运算符,将capture的结果输出到frame里面去,就可以获得帧图像
read和上述这种方式选一种即可,不要两个都用
测试代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
VideoCapture capture(0);
int i=0;
//cin >> stop;
while(true) {
i++;
Mat frame;
capture >> frame;
imshow("读取视频",frame);
cout << i << endl;
if (i == 1000) {
capture.release();
break;
}
waitKey(30);
}
return 0;
}
代码中的i是为了能够测试release函数关闭摄像头