金子邦彦研究室人工知能OpenCV 4 の Python プログラムOpenCV を使って avi 動画ファイルの再生

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

◆プログラムの例 (avi 動画ファイル再生プログラム)

#include<cv.h>
#include<highgui.h>

using namespace cv;

int main (int argc, char **argv)
{
  double width;  // 幅
  double height; // 高さ
  double fps; // フレームレート
  double msec; // 現在位置
  double index = -1; // フレームのインデックス
  double ratio; // 相対位置

  CvCapture *capture = NULL;
  IplImage *frame = 0;
  double prev_index; 
  int ch;

  // 幅と高さの取得
  capture = cvCaptureFromFile("/usr/local/share/OpenCV/samples/c/tree.avi");
  width = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH);
  height = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT);
  fps = cvGetCaptureProperty (capture, CV_CAP_PROP_FPS);

  namedWindow ("Video File", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);

  while (1) {
    frame = cvQueryFrame (capture);

    msec = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_MSEC);
    prev_index = index; 
    index = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_FRAMES);
    ratio = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_AVI_RATIO);

    cvShowImage ("Capture", frame);
    ch = cvWaitKey ( 1000.0 / fps ); // 0 はディレイ時間 (ミリ秒単位)
    if (ch == '\x1b') {
      // ESC キー
      break;
    }
    fprintf( stderr, "width = %f, height = %f, fps = %f, index = %f, msec = %f\n", width, height, fps, index, msec );
    if ( prev_index == index ) {
      cvSetCaptureProperty (capture, CV_CAP_PROP_POS_AVI_RATIO, 0.0);
    }

  }

  cvReleaseCapture (&capture);
  cvDestroyWindow ("Capture");

  return 0;
}

◆プログラムの例 (avi 動画ファイルの任意のフレームを表示)

#include<cv.h>
#include<highgui.h>

using namespace cv;

void capture (const char* avi_file_name, const int frame_num)
{
  double width;  // 幅
  double height; // 高さ
  double fps; // フレームレート
  double msec; // 現在位置
  double index = -1; // フレームのインデックス
  double ratio; // 相対位置

  CvCapture *capture = NULL;
  IplImage *frame = 0;
  //  double prev_index; 
  //  int ch;

  // 幅と高さの取得
  capture = cvCaptureFromFile( avi_file_name );
  width = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH);
  height = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT);
  fps = cvGetCaptureProperty (capture, CV_CAP_PROP_FPS);

  // ウインドウは開かない
  namedWindow ("Video File", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);

  // 画像の取得
  cvSetCaptureProperty (capture, CV_CAP_PROP_POS_FRAMES, frame_num);
  frame = cvQueryFrame (capture);

  // 情報の取得 
  msec = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_MSEC);
  index = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_FRAMES);
  ratio = cvGetCaptureProperty (capture, CV_CAP_PROP_POS_AVI_RATIO);

  cvShowImage ("Capture", frame);
  fprintf( stderr, "width = %f, height = %f, fps = %f, index = %f, msec = %f\n", width, height, fps, index, msec );

  cvWaitKey( 10000.0 ); 
  cvReleaseCapture (&capture);
  cvDestroyWindow ("Capture");

  return;
}

int main (int argc, char **argv)
{
  capture( "/usr/local/share/OpenCV/samples/c/tree.avi", 60 ); 
  return 0; 
}

◆ Linux でのビルド手順例

g++ -o a.out hoge.cc -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_photo -lopencv_imgproc -lopencv_highgui -lopencv_core

[image]