Za pomocą cvSetCaptureProperty() możesz przełączać się między ramkami, w milisekundach lub w liczbie porządkowej.
int cvSetCaptureProperty(CvCapture* capture, int property_id, double value);
property_id jest nieruchomość trzeba by użyć. To może być jeden z następujących:
- CV_CAP_PROP_POS_MSEC - pozycja w milisekundach z pliku zaczynając
- CV_CAP_PROP_POS_FRAMES - pozycja w ramkach
- CV_CAP_PROP_POS_AVI_RATIO - pozycja w jednostkach względnych (0 - początek plik, 1 - koniec pliku)
- CV_CAP_PROP_FRAME_WIDTH - szerokość klatek w strumieniu wideo (tylko dla kamer)
- CV_CAP_PROP_FRAME_HEIGHT - hei GHT ramki w strumieniu wideo (tylko dla kamer)
- CV_CAP_PROP_FPS - szybkość klatek (tylko dla kamer)
- CV_CAP_PROP_FOURCC - kod 4 postać kodera (tylko dla aparatów).
Pierwsze dwa są w Twoim interesie.
EDIT: więcej informacji :)
Można przechodzić klatek po prostu wielokrotnie nazywając wspomnianą funkcję z różnych indeksów ramy.
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex);
Przykład:
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);
}
Można umieścić podobny kod do wykonania każdy użytkownik kliknie przycisk czas do przodu/do tyłu wideo.
Metoda C++ (OpenCV 2 i wyżej) będzie używać tej metody zamiast tego samego property_id i value.
bool VideoCapture::set(int property_id, double value)
Przy okazji, podobnie jak wskazówka, szukanie OpenCV nie działa prawidłowo na flv, jeśli utkniesz w dowolnym momencie, gdy szukanie nie działa. Zajęło mi dzień, aby to rozgryźć !!! –