26

C ++でOpenCVを使用してシークおよび巻き戻し機能(ビデオ(.avi)用)を見つけて実装しようとしましたが、ファイル全体を1回調べて各画像を保存する以外に方法が見つかりません。他に方法はありますか?

どんな助けでも大歓迎です。お早めにどうぞ!

4

4 に答える 4

47

cvSetCaptureProperty() を使用すると、フレームをミリ秒単位または序数のフレーム番号で循環できます。

int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );

property_idは、使用する必要があるプロパティです。次のいずれかになります。

  1. CV_CAP_PROP_POS_MSEC - ファイルの先頭からのミリ秒単位の位置
  2. CV_CAP_PROP_POS_FRAMES - フレーム内の位置
  3. CV_CAP_PROP_POS_AVI_RATIO - 相対単位での位置 (0 - ファイルの開始、1 - ファイルの終了)
  4. CV_CAP_PROP_FRAME_WIDTH - ビデオ ストリームのフレーム幅 (カメラのみ)
  5. CV_CAP_PROP_FRAME_HEIGHT - ビデオ ストリーム内のフレームの高さ (カメラのみ)
  6. CV_CAP_PROP_FPS - フレームレート (カメラのみ)
  7. CV_CAP_PROP_FOURCC - コーデックの 4 文字のコード (カメラのみ)。

最初の 2 つは興味深いものです。

編集:詳細:)

前述の関数をさまざまなフレーム インデックスで繰り返し呼び出すだけで、フレームを切り替えることができます。

cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex);

例:

IplImage*  frame;
CvCapture* capture = cvCreateFileCapture("test.avi");

/* iterate through first 10 frames */
for (int i = 0; i < 10; i++)
{
   /* set pointer to frame index i */
   cvSetCaptureProperty(capture, CV_CAP_POS_FRAMES, i);

   /* capture the frame and do sth with it */
   frame = cvQueryFrame(capture);
}

ユーザーがボタンをクリックしてビデオを早送り/巻き戻しするたびに、同様のコードを実行することができます。

C++ メソッド (OpenCV 2 以降) では、同じ property_id と値で代わりにこのメソッドを使用します。

bool VideoCapture::set(int property_id, double value)
于 2010-06-05T16:51:10.397 に答える
1

ファイル全体を IplImages の配列に読み込んでから、それを処理する必要があると思います。その理由は、cvQueryFrame は一方向のプロセスであり、一度に 1 フレームずつ順番に読み取るためです。他に方法が思いつきません。ビデオの長さによっては、初期化時間はそれほど悪くない場合があります。

あなたが言うように、cvTrackbars は主にパラメーターを変更するために使用されます。変数の値 (ポインター形式のパラメーターとして指定) を変更し、コールバック関数をスローします。残念ながら、私が知る限り、HighGUI の唯一のボタン スタイル要素です。

于 2010-06-04T14:02:44.337 に答える
0

highguiライブラリには、シークバー(cvCreateTrackbarとその仲間)の関数があります。

于 2010-06-04T13:48:09.230 に答える