OpenCV を使って avi 動画ファイルの再生
【概要】
ここでは,OpenCV の C++ API を使用して avi 動画ファイルを再生する方法を示す。動画ファイルを連続再生するプログラムと,任意のフレームを指定して表示するプログラムの2つの例を紹介する(フレームとは,動画を構成する1枚1枚の静止画のことである)。
【目次】
【関連する外部ページ】
- OpenCV の公式ページ:https://opencv.org
- GitHub の OpenCV のページ:https://github.com/opencv/opencv/releases
【サイト内の関連情報】
- OpenCV について [PDF] ,[パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順:別ページ »で説明
- OpenCV と Python を活用した画像・ビデオ処理プログラム:別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム:別ページ »にまとめている。
1. avi 動画ファイル再生プログラム
以下のプログラムは,指定した avi ファイルを読み込み,フレームレートに合わせて連続再生する。再生中は標準エラー出力にフレーム情報を表示し,ESC キーで終了する。動画が終端に達すると先頭に戻って再生を継続する。
#include <opencv2/opencv.hpp>
#include <cstdio>
using namespace cv;
int main(int argc, char **argv)
{
VideoCapture capture("/usr/local/share/OpenCV/samples/c/tree.avi");
double width = capture.get(CAP_PROP_FRAME_WIDTH);
double height = capture.get(CAP_PROP_FRAME_HEIGHT);
double fps = capture.get(CAP_PROP_FPS);
namedWindow("Video File", WINDOW_AUTOSIZE);
Mat frame;
while (1) {
capture >> frame;
if (frame.empty()) {
capture.set(CAP_PROP_POS_FRAMES, 0);
continue;
}
double msec = capture.get(CAP_PROP_POS_MSEC);
double index = capture.get(CAP_PROP_POS_FRAMES);
imshow("Video File", frame);
int ch = waitKey(1000.0 / fps);
if (ch == 27) {
break;
}
fprintf(stderr, "width = %f, height = %f, fps = %f, index = %f, msec = %f\n", width, height, fps, index, msec);
}
capture.release();
destroyWindow("Video File");
return 0;
}
2. avi 動画ファイルの任意のフレームを表示
以下のプログラムは,指定した avi ファイルから任意のフレーム番号の画像を取得して表示する。フレーム番号を指定することで,動画内の特定の場面を静止画として確認できる。
#include <opencv2/opencv.hpp>
#include <cstdio>
using namespace cv;
void capture(const char *avi_file_name, const int frame_num)
{
VideoCapture capture(avi_file_name);
double width = capture.get(CAP_PROP_FRAME_WIDTH);
double height = capture.get(CAP_PROP_FRAME_HEIGHT);
double fps = capture.get(CAP_PROP_FPS);
namedWindow("Video File", WINDOW_AUTOSIZE);
capture.set(CAP_PROP_POS_FRAMES, frame_num);
Mat frame;
capture >> frame;
double msec = capture.get(CAP_PROP_POS_MSEC);
double index = capture.get(CAP_PROP_POS_FRAMES);
imshow("Video File", frame);
fprintf(stderr, "width = %f, height = %f, fps = %f, index = %f, msec = %f\n", width, height, fps, index, msec);
waitKey(10000);
capture.release();
destroyWindow("Video File");
return;
}
int main(int argc, char **argv)
{
capture("/usr/local/share/OpenCV/samples/c/tree.avi", 60);
return 0;
}
3. Linux でのビルド手順例
以下のコマンドで上記プログラムをビルドする。OpenCV 5 では,必要なインクルードパスとライブラリは pkg-config の opencv5 から取得する(pkg-config は,コンパイルに必要なオプションを自動で出力する補助ツールである)。
g++ -o a.out hoge.cc $(pkg-config --cflags --libs opencv5)
4. 実行結果
上図は動画再生プログラムの実行画面である。