Функция Поиска OpenCV / Перемотка Назад

Я пытался найти / реализовать функцию поиска и перемотки назад (для видео (.avi)) используя OpenCV в C++, но я не могу найти способ сделать это, кроме как пройти через весь файл один раз и сохранить каждое изображение. Есть ли другой способ?

любая помощь была бы очень признательна; спасибо заранее!

4 ответов


С помощью 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-символьный код кодека (только для камер).

первые два представляют для вас интерес.

изменить: дополнительная информация:)

вы можете цикл через кадры, просто повторно вызывая упомянутую функцию с различными индексами кадров.

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-это односторонний процесс, он читает по одному кадру за раз. Я не могу придумать ничего другого. В зависимости от длины видео время инициализации может быть не слишком плохим.

cvTrackbars, как вы говорите, в основном используются для изменения параметров. Они изменяют значение переменной (заданное как параметр в форме указателя) и вызывают обратный вызов функция. К сожалению, они являются единственными элементами стиля кнопки в HighGUI, насколько я знаю


на highgui библиотека вы найдете функции для панели поиска (cvCreateTrackbar и друзья).


для C++ и opencv3.4, frame_index-это позиция, которую вы хотите искать.

Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;