C++使用opencv调用本地摄像头录制视频文件

732 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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按键终止视频录制。

录制的过程如下

image.png 录制文件的保存目录如下

image.png

通过调用摄像头一方面可以保存视频文件,另一方面可以通过调用摄像头完成一些视频识别的任务,由于工作时间原因,在后面的博客中会逐渐补充这一部分内容。