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