在VS2017环境下使用OpenCV和C++录制视频

简介

在本文中,我们将介绍如何使用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++录制了视频,并将视频保存到指定的路径中。

猜你喜欢

转载自blog.csdn.net/weixin_59276073/article/details/130514219