opencv视频的录制
本篇文章来讲解opencv视频录制技术。本篇文章主要给大家讲解了opencv中视频的录制,大家可以根据文章做对应的实验。
前言
本篇文章来讲解opencv视频录制技术。
一、读取视频长宽帧数
使用get函数可以获取到视频的视频长宽帧数等数据,分别使用CAP_PROP_FRAME_WIDTH,
CAP_PROP_FRAME_HEIGHT,
CAP_PROP_FRAME_COUNT。这些宏即可。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture capture("1.mp4");
Mat image;
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
// Get video frame count
int frameCount = capture.get(CAP_PROP_FRAME_COUNT);
cout << "width:" << width << endl;
cout << "height:" << height << endl;
cout << "frameCount:" << frameCount << endl;
capture.release();
waitKey(0);
return 0;
}
二、VideoWriter类
cv::VideoWriter 是 OpenCV 中的一个类,用于将图像序列写入视频文件。它允许您创建一个视频编写器对象,并将图像帧以指定的格式和参数写入到输出视频文件中。
以下是使用 cv::VideoWriter 的一般步骤:
1.创建 cv::VideoWriter 对象:
cv::VideoWriter videoWriter;
2.打开输出视频文件:
videoWriter.open(outputPath, codec, fps, frameSize, isColor);
outputPath:指定输出视频文件的路径和文件名。
codec:指定视频编码器的四字符码,例如 cv::VideoWriter::fourcc(‘M’, ‘J’, ‘P’, ‘G’) 表示使用 MJPEG 编码器。
fps:指定输出视频的帧率。
frameSize:指定输出视频帧的大小(宽度和高度)。
isColor:指定是否将颜色保存到视频中,如果为 true,则将保存彩色帧;如果为 false,则将保存灰度帧。
3.循环写入图像帧:
videoWriter.write(frame);
frame:将要写入视频的图像帧。
4.完成写入并释放资源:
videoWriter.release();
三、示例源码
在C++中使用OpenCV进行视频录制涉及几个步骤,包括初始化视频捕获对象、设置视频写入对象、捕获帧并将其写入视频文件。下面是一个基本的例子,展示了如何在C++中使用OpenCV录制视频。
1. 导入头文件
首先,确保你包含了必要的头文件:
#include <opencv2/opencv.hpp>
#include <iostream>
2. 主函数
以下是一个完整的示例代码,用于从默认摄像头捕获视频并保存到一个文件中:
int main() {
// 创建视频捕获对象,打开默认摄像头
cv::VideoCapture cap(0);
// 检查摄像头是否打开成功
if (!cap.isOpened()) {
std::cerr << "Error: Could not open the camera." << std::endl;
return -1;
}
// 获取视频帧的宽度和高度
int frame_width = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH));
int frame_height = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT));
// 创建视频写入对象
cv::VideoWriter video("output.avi",
cv::VideoWriter::fourcc('M','J','P','G'),
10,
cv::Size(frame_width, frame_height));
// 检查视频写入对象是否初始化成功
if (!video.isOpened()) {
std::cerr << "Error: Could not open the video file for write." << std::endl;
return -1;
}
// 创建一个窗口
cv::namedWindow("Recording", cv::WINDOW_AUTOSIZE);
// 录制视频
while (true) {
cv::Mat frame;
// 从摄像头捕获一帧
cap >> frame;
// 检查是否成功捕获到帧
if (frame.empty()) {
std::cerr << "Error: Blank frame grabbed." << std::endl;
break;
}
// 显示帧
cv::imshow("Recording", frame);
// 将帧写入视频文件
video.write(frame);
// 按 'q' 键退出循环
if (cv::waitKey(1) == 'q') {
break;
}
}
// 释放视频捕获和写入对象
cap.release();
video.release();
// 销毁所有窗口
cv::destroyAllWindows();
return 0;
}
代码解析
-
创建视频捕获对象:
cv::VideoCapture cap(0);
0
表示默认摄像头。如果你有多个摄像头,可以更改这个数字以选择不同的摄像头。 -
检查摄像头是否打开成功:
if (!cap.isOpened()) { std::cerr << "Error: Could not open the camera." << std::endl; return -1; }
-
获取视频帧的宽度和高度:
int frame_width = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH)); int frame_height = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT));
-
创建视频写入对象:
cv::VideoWriter video("output.avi", cv::VideoWriter::fourcc('M','J','P','G'), 10, cv::Size(frame_width, frame_height));
"output.avi"
是输出文件名。cv::VideoWriter::fourcc('M','J','P','G')
是编码格式。10
是帧率。cv::Size(frame_width, frame_height)
是帧的大小。
-
录制视频:
while (true) { cv::Mat frame; cap >> frame; if (frame.empty()) { std::cerr << "Error: Blank frame grabbed." << std::endl; break; } cv::imshow("Recording", frame); video.write(frame); if (cv::waitKey(1) == 'q') { break; } }
-
释放资源:
cap.release(); video.release(); cv::destroyAllWindows();
这个代码示例演示了如何使用OpenCV从摄像头捕获视频并将其保存到文件中,同时在屏幕上显示录制的视频。
总结
本篇文章主要给大家讲解了opencv中视频的录制,大家可以根据文章做对应的实验。
更多推荐
所有评论(0)