前言

本篇文章来讲解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;
}

代码解析

  1. 创建视频捕获对象

    cv::VideoCapture cap(0);
    

    0 表示默认摄像头。如果你有多个摄像头,可以更改这个数字以选择不同的摄像头。

  2. 检查摄像头是否打开成功

    if (!cap.isOpened()) {
        std::cerr << "Error: Could not open the camera." << std::endl;
        return -1;
    }
    
  3. 获取视频帧的宽度和高度

    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));
    
  4. 创建视频写入对象

    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) 是帧的大小。
  5. 录制视频

    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;
        }
    }
    
  6. 释放资源

    cap.release();
    video.release();
    cv::destroyAllWindows();
    

这个代码示例演示了如何使用OpenCV从摄像头捕获视频并将其保存到文件中,同时在屏幕上显示录制的视频。

总结

本篇文章主要给大家讲解了opencv中视频的录制,大家可以根据文章做对应的实验。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐