一、开发环境
1.opencv-3.3.0-vc14
2.VS 2017
3.win10
二、实验步骤
三、分步实现
基于opencv提供的两个主要的视频操控类VideoCapture和VideoWriter来实现录制视频功能,由于一些参考文档中只实现单一录像或单一拍照功能,或录制视频会出现解码错误问题,故写此学习笔记,以供参考。
1.实现调用摄像头
#include
#include
int main()
{
using namespace std;
using namespace cv;
VideoCapture capture;
capture.open(0); //修改这个参数可以选择打开想要用的摄像头
Mat frame;
while (true)
{
capture >> frame;
imshow("外接摄像头", frame); //remember, imshow() needs a window name for its first parameter
if (waitKey(30) >= 0)
break;
}
return 0;
}
2.实现调用摄像头并按空格拍照
#include
#include
using namespace cv;
using namespace std;
string writePath = "E:/";
int main(int argc, char** argv)
{
VideoCapture capture(0); //从摄像头读入视频
//循环显示每一帧
string name;
namedWindow("hello", CV_WINDOW_AUTOSIZE);
int i = 0;
while (1)
{
Mat frame, gray; //定义mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
//cvtColor(frame, gray, COLOR_BGR2GRAY); //将当前帧的彩色帧变成灰度帧
if (32 == waitKey(20)) { //空格拍照
name = writePath + to_string(i) + ".jpg";
imwrite(name, frame);
cout << name << endl;
i++;
}
imshow("读取视频", frame); //显示灰度帧改为gray
if (waitKey(1) == 27) //按下esc退出视频每帧的显示
{
cout << "按下esc键" << endl;
break; //直接跳出循环
}
}
return 0;
}
3.实现调用摄像头录制视频,并可播放
#include
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture(0); //读入视频
VideoWriter writer("E:/test.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
while (capture.isOpened())
{
Mat frame;
capture >> frame; //读取当前帧
writer << frame; //将读取的帧保存
imshow("video", frame);
if (waitKey(10) == 27) //如果按下ESC退出
{
break;
}
}
}
4.实现调用、拍照、录像,并视频可播放
#include
#include
using namespace cv;
using namespace std;
string writePath = "E:/photo/";
int main(int argc, char** argv)
{
VideoCapture capture(0); //从摄像头读入视频
VideoWriter writer("E:/video/test.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
//循环显示每一帧
string name;
//namedWindow("hello", CV_WINDOW_AUTOSIZE);
int i = 0;
while (1)
{
Mat frame, gray; //定义mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
//cvtColor(frame, gray, COLOR_BGR2GRAY); //将当前帧的彩色帧变成灰度帧
if (32 == waitKey(20)) { //空格拍照
name = writePath + to_string(i) + ".jpg";
imwrite(name, frame);
cout << name << endl;
i++;
}
capture >> frame; //读取当前帧
writer << frame; //将读取的帧保存
imshow("读取视频", frame); //显示灰度帧改为gray
if (waitKey(1) == 27) //按下esc退出视频每帧的显示
{
cout << "按下esc键" << endl;
break; //直接跳出循环
}
}
return 0;
}
//注意此处photo和video保存路径改变