这段代码的功能是使用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 sourceVideoCapture cap(0); // 创建VideoCapture对象,使用默认摄像头作为视频源// check if we succeededif (!cap.isOpened()) { // 如果摄像头没有正常打开cerr << "ERROR! Unable to open camera\n"; // 打印错误消息return -1; // 返回-1,程序异常结束}// get one frame from camera to know frame size and typecap >> src; // 从摄像头捕获一帧视频// check if we succeededif (src.empty()) { // 如果捕获到的帧是空的cerr << "ERROR! blank frame grabbed\n"; // 打印错误消息return -1; // 返回-1,程序异常结束}bool isColor = (src.type() == CV_8UC3); // 检查捕获帧是否是彩色的//--- INITIALIZE VIDEOWRITERVideoWriter 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 succeededif (!writer.isOpened()) { // 如果视频文件没有成功打开cerr << "Could not open the output video file for write\n"; // 打印错误消息return -1; // 返回-1,程序异常结束}//--- GRAB AND WRITE LOOPcout << "Writing videofile: " << filename << endl<< "Press any key to terminate" << endl; // 提示视频文件正在写入,并指示按任意键停止for (;;) // 无限循环{// check if we succeededif (!cap.read(src)) { // 如果没有读取到帧cerr << "ERROR! blank frame grabbed\n"; // 打印错误消息break; // 跳出循环}// encode the frame into the videofile streamwriter.write(src); // 将捕获的帧编码后写入视频文件中// show live and wait for a key with timeout long enough to show imagesimshow("Live", src); // 在窗口中显示实时视频帧if (waitKey(5) >= 0) // 等待按键,如果有按键则退出break; }// the videofile will be closed and released automatically in VideoWriter destructorreturn 0; // 程序正常结束,视频文件在VideoWriter对象析构时自动关闭和释放
}
该代码是一个非常基础的使用OpenCV库进行视频采集和录制的示例。主要功能包括从默认摄像头捕获视频帧,检查捕获是否成功,并使用MJPG编解码器以25 FPS的帧率将捕获的视频帧写入名为“live.avi”的文件中。循环体内会不断从摄像头读取帧,如果成功捕获到帧,会将其写入视频文件,并实时显示在名为"Live"的窗口中。如果在等待键盘输入时出现按键(或者5ms内),则会结束捕获循环,程序结束时会自动关闭并释放视频文件资源。