2

私はプロジェクトにOpenCVを使用していますが、まったくの初心者です。

大容量記憶装置リポジトリにビデオファイルがあり、入力の特定のサンプリング間隔で区切られているビデオストリームのすべてのフレームにアクセスするメソッドを作成したいと考えています。

ビデオは複数の形式(AVI – WMV – MPEG-2 – MPEG-4)にすることができます。

私はこの方法が次のように機能するはずだと考えていました。

1. Have as input a desired sampling interval
2. Access the video at timestamp corresponding to the sampling interval
3. Save selected frame of video as an image
4. Go to next frame as determined from sampling frequency.

OpenCVメソッドを使用してそのようなメソッドを実装する方法について、いくつかのコード、または少なくとも指示を提供するのを手伝ってもらえますか?

4

2 に答える 2

2

VideoCapture :: setメソッドを確認し、CV_CAP_PROP_POS_MSECを使用して、ビデオファイルから特定のフレームを取得できます。このコードはテストしていませんが、次のようになります。

cv::VideoCapture vc(video_file_name);
cv::Mat frame;

//How you will get the interval is up to you
float interval = getInterval();
float cur_interval = 0;

while(1)
{
   vc.set(CV_CAP_PROP_POS_MSEC, cur_interval);

   //The operator>> will return a NULL pointer if the next frame isn't valid
   if(vc >> frame)
     cv::imwrite("filename.jpg", frame);
   else
     break;

   cur_interval += interval;
}
于 2012-01-03T17:26:13.673 に答える
0

OpenCVはビデオを読むためにffmpegをラップしますが、ffmpegはおそらくあなたが説明するタスクにより適しています。

ZeranoeのWindowsビルドはここで入手できます(Windowsを使用していると仮定すると、Linuxを使用している場合は、おそらくそれにアクセスする方法を知っています)。Windowsでコマンドラインバージョンを使用するだけの場合は静的ビルドを取得し、そうでない場合は開発ビルドを取得します。

これは、 ffmpegAPIを使用したプログラミングの開始に関するDrangerのチュートリアルです。

このチュートリアルを使用してffmpegとPythonを組み合わせてこれを実行し、すべてのフレームを抽出できる場合があります。

HTH!

于 2012-01-03T15:37:59.987 に答える