C++でOpenCVを使用してシークおよび巻き戻し機能(ビデオ(.avi)用)を見つけて実装しようとしていますが、ファイル全体を一度調べて各画像を保存する以外に、それを行う方法を見つけることができません。他に方法はありますか?
どんな助けでも大歓迎です。よろしくお願いします!
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とvalueでこのメソッドを使用します。
bool VideoCapture::set(int property_id, double value)
ファイル全体をIplImageの配列に読み込んでから、それを処理する必要があると思います。その理由は、cvQueryFrameは一方向のプロセスであり、一度に1つのフレームを順番に読み取るためです。他の方法は考えられません。ビデオの長さによっては、初期化時間はそれほど悪くない場合があります。
CvTrackbarsはあなたが言うように、主にパラメータを変更するために使用されます。変数の値(ポインター形式のパラメーターとして指定)を変更し、コールバック関数をスローします。残念ながら、私が知る限り、HighGUIのボタンスタイルの要素はこれらだけです。
c ++およびopencv3.4の場合、frame_indexはシークしたい位置です。
Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;
highgui ライブラリには、シークバー(cvCreateTrackbarとその仲間)の関数があります。