简介
在本文中,我们将介绍如何使用OpenCV和C++来录制视频。我们将使用VideoCapture和VideoWriter类来捕获摄像头的帧并将其保存为视频文件。
1. 设置录制视频的参数
首先,我们需要设置录制视频的参数。我们将设置帧的宽度、高度、帧率和录制时间。在本例中,我们将设置帧的宽度为640像素,高度为480像素,帧率为30帧每秒,录制时间为120秒。
// 设置录制视频的参数
int frame_width = 640;
int frame_height = 480;
int fps = 30;
int duration = 120; // 录制时间,单位为秒
2. 创建VideoWriter对象来保存视频
接下来,我们需要创建一个VideoWriter对象来保存视频。我们需要指定保存视频的路径、编解码器、帧率和帧的大小。
// 创建VideoWriter对象来保存视频
string filename = "C:/Users/41549/Desktop/output.avi"; // 修改为保存的路径
VideoWriter video(filename, CV_FOURCC('M', 'J', 'P', 'G'), fps, Size(frame_width, frame_height));
在以上代码中,我们指定了保存视频的路径、编解码器(MJPG)、帧率和帧的大小。
3. 创建一个摄像头对象
现在,我们需要创建一个摄像头对象。我们将使用VideoCapture类来创建摄像头对象。
// 创建一个摄像头对象
VideoCapture cap(0);
// 检查摄像头是否打开
if (!cap.isOpened())
{
cerr << "Error opening video stream" << endl;
return -1;
}
在以上代码中,我们创建了一个名为cap的摄像头对象。我们使用0作为参数来指定默认的摄像头。然后,我们检查摄像头是否打开。如果摄像头没有打开,我们将输出错误信息并退出程序。
4. 录制视频
现在,我们已经准备好开始录制视频了。我们将使用while循环来捕获每一帧,并将每一帧写入到视频文件中。
// 获取开始录制的时间
time_t start_time = time(nullptr);
// 录制视频
while (difftime(time(nullptr), start_time) < duration)
{
Mat frame;
cap.read(frame);
// 检查帧是否读取成功
if (frame.empty())
{
cerr << "Error reading frame" << endl;
break;
}
// 写入帧到视频文件
video.write(frame);
// 显示录制的视频
imshow("Recording", frame);
// 等待30毫秒,以便在窗口中显示帧
waitKey(30);
}
在以上代码中,我们使用difftime函数来计算录制视频的时间。在每个循环迭代中,我们使用cap.read函数来捕获摄像头的帧。然后,我们检查帧是否读取成功。如果帧为空,我们将输出错误信息并退出程序。接下来,我们使用video.write函数将帧写入到视频文件中。
最后,我们使用imshow函数在窗口中显示录制的视频,并使用waitKey函数等待30毫秒,以便在窗口中显示帧。
5. 释放摄像头和视频文件
现在,我们已经完成了录制视频的任务。我们需要释放摄像头和视频文件,并销毁窗口。
// 释放摄像头和视频文件
cap.release();
video.release();
// 销毁窗口
destroyAllWindows();
在以上代码中,我们使用cap.release函数释放摄像头,使用video.release函数释放视频文件,并使用destroyAllWindows函数销毁窗口。
6. 完整代码和运行结果
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main()
{
// 设置录制视频的参数
int frame_width = 640;
int frame_height = 480;
int fps = 30;
int duration = 120; // 录制时间,单位为秒
// 创建VideoWriter对象来保存视频
string filename = "C:/Users/41549/Desktop/output.avi"; // 修改为保存的路径
VideoWriter video(filename, CV_FOURCC('M', 'J', 'P', 'G'), fps, Size(frame_width, frame_height));
// 创建一个摄像头对象
VideoCapture cap(0);
// 检查摄像头是否打开
if (!cap.isOpened())
{
cerr << "Error opening video stream" << endl;
return -1;
}
// 获取开始录制的时间
time_t start_time = time(nullptr);
// 录制视频
while (difftime(time(nullptr), start_time) < duration)
{
Mat frame;
cap.read(frame);
// 检查帧是否读取成功
if (frame.empty())
{
cerr << "Error reading frame" << endl;
break;
}
// 写入帧到视频文件
video.write(frame);
// 显示录制的视频
imshow("Recording", frame);
// 等待30毫秒,以便在窗口中显示帧
waitKey(30);
}
// 释放摄像头和视频文件
cap.release();
video.release();
// 销毁窗口
destroyAllWindows();
// 输出视频保存的路径
cout << "Video saved at: " << filename << endl;
return 0;
}
运行结果:
我们成功地使用OpenCV和C++录制了视频,并将视频保存到指定的路径中。