C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++とOpenCVで動画の経過時間を計算・表示する方法

この記事では、C++とOpenCVを使用して、動画再生中の経過時間(Elapsed Time)を計算して表示する方法を詳しく解説します。

経過時間の取得方法

OpenCVでは、VideoCaptureクラスが持つget()メソッドにCAP_PROP_POS_MSECプロパティを指定することで、現在の再生位置をミリ秒単位で取得できます。この値を1000で割れば、秒単位の経過時間として扱うことが可能です。

以下のプログラムは、動画ファイルを再生しながら、その時点での経過時間をコンソールに出力するサンプルコードです。

サンプルコード

#include<opencv2/opencv.hpp>//VideoCaptureクラスを使うためのOpenCVヘッダー//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
   Mat myImage;//フレームを読み込むための行列を宣言//
   namedWindow("Video Player");//動画を表示するウィンドウを宣言//
   VideoCapture cap("video.mp4");//動画ファイルを読み込むオブジェクトを宣言//
   if (!cap.isOpened()){ //動画ストリームが見つからない場合はエラーを表示//
      cout << "No video stream detected" << endl;
      system("pause");
      return-1;
   }
   while (true){ //動画を表示し続けるための無限ループ//
      cap >> myImage;
      int elapsed_time;//経過時間を格納する整数変数を宣言//
      elapsed_time=cap.get(CAP_PROP_POS_MSEC);//CAP_PROP_POS_MSECで経過時間(ミリ秒)を取得//
      cout << "Ellapsed time(in second):" << elapsed_time / 1000 << endl;//経過時間を秒単位で表示//
      if (myImage.empty()){ //フレームが読み込めなくなったらループを抜ける//
         break;
      }
      imshow("Video Player", myImage);//動画を表示//
      char c = (char)waitKey(25);//25ミリ秒の処理待ち時間を設け、キー入力を監視//
      if (c == 27){ //'Esc'キーが押されたらループを抜けて終了//
         break;
      }
   }
   cap.release();//バッファメモリを解放//
   return 0;
}

コードのポイント

  • cap.get(CAP_PROP_POS_MSEC):動画内の現在位置をミリ秒で返すプロパティです。戻り値はdouble型ですが、ここではint型変数に格納しています。
  • elapsed_time / 1000:ミリ秒を秒に変換して表示しています。より正確な値が必要な場合は、小数点以下も出力するとよいでしょう。
  • waitKey(25):1フレームあたり約25ミリ秒の表示間隔を確保し、同時に'Esc'キーによる中断操作を受け付けます。

実行結果

このプログラムを実行すると、指定した動画ファイルが「Video Player」ウィンドウ上で再生され、同時にコンソールウィンドウには再生の進行に合わせて秒単位の経過時間が随時出力されます。

C++とOpenCVで動画の経過時間を計算・表示する方法C++とOpenCVで動画の経過時間を計算・表示する方法

この手法を応用すれば、特定のシーンまでの到達時間の計測や、動画解析におけるタイムスタンプ管理など、さまざまな用途に活用できます。

  1. C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説

    バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す

  2. C++とOpenCVで画像のチャンネル数を取得する方法を解説

    この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下