设想一下现在我们有这样一个需求,需要通过键盘来实现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;
}
}
}
}
}