opencv 利用快捷键来实现USB摄像头录制和抓拍

设想一下现在我们有这样一个需求,需要通过键盘来实现usb摄像头的录制和抓图,并且最终保存的名称用当前的时间来命名。

解决思路:

由于之前自己的很多操作都是在QT上进行的,因此本次的需求也可以借助QT这个强大的工具,QDir判断文件夹的是否存在,QDateTime获得当前的时间用于最终文件的命名。

#include <opencv2\opencv.hpp>
#include<iostream>
#include<QDir>
#include<QDateTime>
using namespace std;
using namespace cv;
Mat img; 
VideoWriter output; 
bool flag = false; //录制视频标志位,True表示开始录制
/* 在程序运行之前先判断是否存在该文件夹,如果不存在,则创建。  */
void begin()
{
	QDir dir("D:\\Video_Recording");
	if (!dir.exists())//判断需要创建的文件夹是否存在
	{
		dir.mkdir("D:\\Video_Recording"); //创建文件夹
	}
}
/* 主函数入口 */
void  main()
{
	begin();
	VideoCapture cap(0);
	while (true)
	{
		cap >> img;
		if (!img.empty())
		{
			imshow("Annie", img);
			if (flag == true)
			{
				output.write(img);// flag为true则开始写入视频
			}
			char k = char(waitKey(20)); //等待时间20ms,判断此时的键盘输入
			/* 利用switch case来判断执行相应的操作,"q"表示退出usb摄像头,"p"表示开始抓图,"v"表示开始录像,"s"表示停止录像  */
			switch (k)
			{
			case 'q':
			{
				cout << "stop" << endl;
				output.release();
				cap.release();
				destroyAllWindows();
				break;
			}
			case 'p':
			{   
				QString filename = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss");
				string file = "D:\\Video_Recording\\" + filename.toStdString() + ".png";
				imwrite(file, img);
				break;
			}
			case 'v':
			{
				QString filename2 = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss");
				string file2 = filename2.toStdString();
				output.open("D:\\Video_Recording\\" + file2+ ".mp4", CV_FOURCC('x', 'v', 'i', 'd'), 20, Size(cap.get(CAP_PROP_FRAME_WIDTH), cap.get(CAP_PROP_FRAME_HEIGHT)));
				flag = true;
				break;
			}
			case 's':
			{
				output.release();
				flag = false;
			}
			}
		}
	}
}
	

猜你喜欢

转载自blog.csdn.net/zzzzjh/article/details/83793633