本次要记录的知识点很简单,但是也很实用,就是在OpenCV中关于摄像头的调用及视频的读取。
具体代码如下:

/********************读取视频;调用摄像头********************/
	VideoCapture capture;
	capture.open(0);
	if (!capture.isOpened())
	{
		cout << "读取失败" << endl;
	}
	int width = capture.get(CAP_PROP_FRAME_WIDTH);
	int height = capture.get(CAP_PROP_FRAME_HEIGHT);
	int count = capture.get(CAP_PROP_FRAME_COUNT);			//视频总帧数
	int fps = capture.get(CAP_PROP_FPS);
	cout << "width:" << width << " ";
	cout << "height:" << height << " ";
	cout << "count:" << count << " ";
	cout << "fps:" << fps << " ";
	int type = saturate_cast<int>(capture.get(CAP_PROP_FOURCC));			//声明视频保存格式
	//VideoWriter writer("D:\\opencv_c++\\video.mp4", type, fps, Size(width, height), true);

	Mat frame;
	namedWindow("frame", WINDOW_AUTOSIZE);
	while (capture.read(frame))
	{
		imshow("frame", frame);
		//writer.write(frame);
		char c = waitKey(fps);
		if (c == 27)
		{
			break;
		}
	}
	capture.release();
	//writer.release();

首先使用VideoCapture capture;来定义一个VideoCapture类对象capture,这个capture可以理解为用来调用摄像头的接口。
接着就使用capture.open(0);这个函数来打开摄像头或者是视频,当参数设置为0时,即为调用电脑自带的摄像头,当设置为其他设备提供的ip地址时,可以调用外部设备的摄像头,例如手机上下载“ip摄像头”这个APP就可以提供一个ip地址,传入该参数后可以使用电脑来调用手机的摄像头;当该参数设置为某个视频文件的路径时,意思是打开该视频文件。
随后判断摄像头或视频文件是否成功打开,通过capture.isOpened()这个函数来判断,如果成功,该函数放回true;如果失败则返回false。

以下几行代码的作用是获取打开的视频的格式信息,如每一帧的宽度、高度、总帧数和帧率。

int width = capture.get(CAP_PROP_FRAME_WIDTH);
	int height = capture.get(CAP_PROP_FRAME_HEIGHT);
	int count = capture.get(CAP_PROP_FRAME_COUNT);			//视频总帧数
	int fps = capture.get(CAP_PROP_FPS);

下面这个while循环就是实现了实时捕获画面并显示出来。通过capture.read(frame)来获取每一帧图像并用变量frame表示,并在一个窗口上显示出来。而char c = waitKey(fps)是通过waitkey()函数来获取用户的键盘输入并赋值给变量c。‘27’代表的是键盘上的esc键,当程序执行时会陷入while死循环,直到用户按下esc键才退出。

while (capture.read(frame))
	{
		imshow("frame", frame);
		//writer.write(frame);
		char c = waitKey(fps);
		if (c == 27)
		{
			break;
		}
	}

如果要将捕获的视频保存起来,可以用VideoWriter writer("D:\\opencv_c++\\video.mp4", type, fps, Size(width, height), true)来实现。其中VideoWriter类对象writer的第一个参数,是要保存的路径;第二个参数是保存的文件类型,可以预先通过int type = saturate_cast<int>(capture.get(CAP_PROP_FOURCC))来定义,其中是获取视频的FOURCC(四字符码),并转换成int类型,再赋值给变量type;第三个参数是保存视频的帧率;第四个参数是保存视频的每一帧图像的尺寸;第五个参数是布尔型,true表示是有颜色的视频。
然后在while循环中,加上writer.write(frame)来将每一帧图像写入视频并保存起来。

最后要注意的是,一定要通过capture.release(); writer.release();这两行代码,将调用的capture和writer释放掉,否则可能会因为被占用的问题而报错。