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

C++とOpenCVで動画の現在のフレーム位置を取得する方法

「現在のフレーム」とは、動画を再生している際に画面に表示されているフレームのことを指します。これは「アクティブフレーム」とも呼ばれます。多くのアプリケーション開発では、現在表示中のフレーム番号を取得する必要が生じることがあります。

OpenCVのVideoCaptureクラスには、CAP_PROP_POS_FRAMESプロパティを指定してget()メソッドを呼び出すことで、現在のフレーム位置(0から始まるインデックス)を取得する機能が用意されています。

以下のプログラムは、動画の現在のフレーム位置を読み取り、コンソールウィンドウに表示します。

サンプルコード

#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 current_Frame;// 現在のフレーム位置を格納する整数変数を宣言//
      current_Frame = cap.get(CAP_PROP_POS_FRAMES);// 現在のフレーム位置を読み取る//
      if (myImage.empty()){ // フレームが検出されない場合はループを抜ける//
         break;
      }
      cout << "Current Frame Number:" << current_Frame << endl;
      imshow("Video Player", myImage);// 動画を表示//
      char c = (char)waitKey(25);// 25ミリ秒の処理時間を確保し、中断条件を設定//
      if (c == 27){ // 「Esc」キーが押されたらループを抜ける//
         break;
      }
   }
   cap.release();// バッファメモリを解放//
   return 0;
}

コードのポイント解説

1. CAP_PROP_POS_FRAMESについて

cap.get(CAP_PROP_POS_FRAMES)は、現在のデコード済みフレームの位置をdouble型で返します。この値は0始まりのインデックスであり、動画の先頭フレームでは「0」が返されます。

2. エラーハンドリング

cap.isOpened()で動画ファイルが正常に開けたかどうかを確認しています。開けなかった場合はエラーメッセージを表示してプログラムを終了します。

3. ループの終了条件

読み込んだフレームが空(myImage.empty())の場合、動画の終端に達したと判断してループを終了します。また、「Esc」キー(ASCIIコード27)が押された場合も再生を中断できます。

実行結果

このプログラムを実行すると、動画が再生されると同時に、コンソールウィンドウに現在のフレーム番号がリアルタイムで表示されます。

C++とOpenCVで動画の現在のフレーム位置を取得する方法

C++とOpenCVで動画の現在のフレーム位置を取得する方法

応用例

現在のフレーム位置の取得は、以下のような場面で活用できます。

  • 特定のフレームにシーク(ジャンプ)する機能の実装
  • 動画の編集やトリミング処理での範囲指定
  • フレーム単位での解析結果の記録
  • 再生進捗バーの表示

なお、特定のフレームへ移動したい場合は、cap.set(CAP_PROP_POS_FRAMES, フレーム番号)を使用することで実現できます。

  1. C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説

    OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。 「at」メソッドでピクセル値を取得する まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。 サンプルコード #include<iostream> #include<opencv2/highgui/highgui.hpp> using namespace std;

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

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