这段代码的功能是使用OpenCV从默认摄像头捕获视频流,并将这些视频流实时写入到一个名为live.avi文件中。视频流以'MJPG'编码格式被写入,帧率设置为25帧每秒。程序还会通过一个窗口实时显示摄像头捕获的画面,窗口标题为"Live"。用户可以通过任意按键终止视频捕获和写入的过程。如果在任何步骤中出现错误(如摄像头无法打开、捕获帧为空等),程序将输出相应的错误信息并退出。
/**
@file videowriter_basic.cpp // 文件名为videowriter_basic.cpp
@brief A very basic sample for using VideoWriter and VideoCapture // 文件描述:使用VideoWriter和VideoCapture的非常基础示例
@author PkLab.net // 作者:PkLab.net
@date Aug 24, 2016 // 日期:2016年8月24日
*/
#include <opencv2/core.hpp> // 包含opencv的核心库文件
#include <opencv2/videoio.hpp> // 包含处理视频输入输出的库文件
#include <opencv2/highgui.hpp> // 包含图形用户界面的库文件
#include <iostream> // 包含输入输出流的库文件
#include <stdio.h>
using namespace cv; // 使用cv命名空间中的所有成员
using namespace std; // 使用std命名空间中的所有成员
int main(int, char**) // 主函数入口
{
Mat src; // 定义一个Mat对象存放视频帧
// use default camera as video source
VideoCapture cap(0); // 创建VideoCapture对象,使用默认摄像头作为视频源
// check if we succeeded
if (!cap.isOpened()) { // 如果摄像头没有正常打开
cerr << "ERROR! Unable to open camera\n"; // 打印错误消息
return -1; // 返回-1,程序异常结束
}
// get one frame from camera to know frame size and type
cap >> src; // 从摄像头捕获一帧视频
// check if we succeeded
if (src.empty()) { // 如果捕获到的帧是空的
cerr << "ERROR! blank frame grabbed\n"; // 打印错误消息
return -1; // 返回-1,程序异常结束
}
bool isColor = (src.type() == CV_8UC3); // 检查捕获帧是否是彩色的
//--- INITIALIZE VIDEOWRITER
VideoWriter writer; // 创建VideoWriter对象用于写视频文件
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G'); // 选择希望使用的编解码器(必须在运行时可用)
double fps = 25.0; // 创建视频流的帧率
string filename = "./live.avi"; // 输出视频文件的名称
writer.open(filename, codec, fps, src.size(), isColor); // 打开视频文件准备写入
// check if we succeeded
if (!writer.isOpened()) { // 如果视频文件没有成功打开
cerr << "Could not open the output video file for write\n"; // 打印错误消息
return -1; // 返回-1,程序异常结束
}
//--- GRAB AND WRITE LOOP
cout << "Writing videofile: " << filename << endl
<< "Press any key to terminate" << endl; // 提示视频文件正在写入,并指示按任意键停止
for (;;) // 无限循环
{
// check if we succeeded
if (!cap.read(src)) { // 如果没有读取到帧
cerr << "ERROR! blank frame grabbed\n"; // 打印错误消息
break; // 跳出循环
}
// encode the frame into the videofile stream
writer.write(src); // 将捕获的帧编码后写入视频文件中
// show live and wait for a key with timeout long enough to show images
imshow("Live", src); // 在窗口中显示实时视频帧
if (waitKey(5) >= 0) // 等待按键,如果有按键则退出
break;
}
// the videofile will be closed and released automatically in VideoWriter destructor
return 0; // 程序正常结束,视频文件在VideoWriter对象析构时自动关闭和释放
}
该代码是一个非常基础的使用OpenCV库进行视频采集和录制的示例。主要功能包括从默认摄像头捕获视频帧,检查捕获是否成功,并使用MJPG编解码器以25 FPS的帧率将捕获的视频帧写入名为“live.avi”的文件中。循环体内会不断从摄像头读取帧,如果成功捕获到帧,会将其写入视频文件,并实时显示在名为"Live"的窗口中。如果在等待键盘输入时出现按键(或者5ms内),则会结束捕获循环,程序结束时会自动关闭并释放视频文件资源。