導入
この記事では、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++ を使用してビデオを正常に録画し、指定されたパスにビデオを保存しました。