文章目录
- 前言
- 一、读取视频长宽帧数
- 二、VideoWriter类
- 三、示例源码
- 1. 导入头文件
- 2. 主函数
- 代码解析
- 总结
前言
本篇文章来讲解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 countint 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中视频的录制,大家可以根据文章做对应的实验。