C ++でOpenCVを使用してシークおよび巻き戻し機能(ビデオ(.avi)用)を見つけて実装しようとしましたが、ファイル全体を1回調べて各画像を保存する以外に方法が見つかりません。他に方法はありますか?
どんな助けでも大歓迎です。お早めにどうぞ!
cvSetCaptureProperty() を使用すると、フレームをミリ秒単位または序数のフレーム番号で循環できます。
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
property_idは、使用する必要があるプロパティです。次のいずれかになります。
最初の 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)
ファイル全体を IplImages の配列に読み込んでから、それを処理する必要があると思います。その理由は、cvQueryFrame は一方向のプロセスであり、一度に 1 フレームずつ順番に読み取るためです。他に方法が思いつきません。ビデオの長さによっては、初期化時間はそれほど悪くない場合があります。
あなたが言うように、cvTrackbars は主にパラメーターを変更するために使用されます。変数の値 (ポインター形式のパラメーターとして指定) を変更し、コールバック関数をスローします。残念ながら、私が知る限り、HighGUI の唯一のボタン スタイル要素です。
highguiライブラリには、シークバー(cvCreateTrackbarとその仲間)の関数があります。