OpenCV を使って avi 動画ファイルの再生

概要

ここでは,OpenCV の C++ API を使用して avi 動画ファイルを再生する方法を示す。動画ファイルを連続再生するプログラムと,任意のフレームを指定して表示するプログラムの2つの例を紹介する(フレームとは,動画を構成する1枚1枚の静止画のことである)。

目次

関連する外部ページ

サイト内の関連情報

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-configopencv5 から取得する(pkg-config は,コンパイルに必要なオプションを自動で出力する補助ツールである)。

g++ -o a.out hoge.cc $(pkg-config --cflags --libs opencv5)

4. 実行結果

動画再生プログラムの実行画面

上図は動画再生プログラムの実行画面である。