持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
有些时候我们需要调用本地的摄像头采集一些视频文件,例如实时监控,可以在本地获取视频文件后通过rtsp或者rtmp推流的方式进行视频直播。opencv中的VideoWriter()类提供了多张图像保存为视频文件的方法。
VideoWriter函数原型如下:
cv::VideoWriter::VideoWriter
// 文件保存的地址
(const String& filename,
// 压缩文件的4字符编码器的代码
int fourcc,
// 保存视频的帧率
double fps,
// 保存视频的尺寸
Size frameSize,
// 保存视频是否为彩色
bool isColor=true)
在python中直接使用cv2提供的函数非常方便,下面给出使用c++的代码进行视频文件的保存。
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img;
//使用本地摄像头
VideoCapture video(0);
// 打开失败时终止程序
if (!video.isOpened())
{
cout << "open faild!";
return -1;
}
//读取视频流的每一帧图像
video >> img;
//如果写入文件为空,表示获取视频失败
if (img.empty())
{
cout << "get image faild!" << endl;
return -1;
}
//判断视频类型,是否为彩色图像
bool isColor = (img.type() == CV_8UC3);
VideoWriter writer;
// 设置编码格式
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
//设置帧率
double fps = 30.0;
//保存的视频文件名称
string filename = "myVideo.avi";
//创建保存视频文件的视频流
writer.open(filename, codec, fps, img.size(), isColor);
//判断视频流是否创建成功
if (!writer.isOpened())
{
cout << "open video stream faild!" << endl;
return -1;
}
while (1)
{
//检测是否执行完毕
//判断能都继续从摄像头或者视频文件中读出一帧图像
if (!video.read(img))
{
cout << "camera link falid!" << endl;
break;
}
//把图像写入视频流
writer.write(img);
imshow("Camera", img);
char c = waitKey(50);
//ESC退出视频保存
if (c == 27)
{
break;
}
}
return 0;
}
上述代码运行后会自动调用本地摄像头进行视频采集,并将视频文件保存在与执行文件同级目录下,当录像完毕后可以通过Esc按键终止视频录制。
录制的过程如下
录制文件的保存目录如下
通过调用摄像头一方面可以保存视频文件,另一方面可以通过调用摄像头完成一些视频识别的任务,由于工作时间原因,在后面的博客中会逐渐补充这一部分内容。