Подтвердить что ты не робот

Функция OpenCV Seek/перемотка назад

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

Любая помощь будет высоко оценена; Спасибо заранее!

4b9b3361

Ответ 1

Используя cvSetCaptureProperty(), вы можете циклически перемещаться по кадрам либо в миллисекундах, либо по порядковому номеру кадра.

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

property_id - это свойство, которое вам нужно использовать. Это может быть одно из следующего:

  • CV_CAP_PROP_POS_MSEC - позиция в миллисекундах с начала файла
  • CV_CAP_PROP_POS_FRAMES - позиция в кадрах
  • CV_CAP_PROP_POS_AVI_RATIO - позиция в относительных единицах (0 - начало файла, 1 - конец файла)
  • CV_CAP_PROP_FRAME_WIDTH - ширина кадров в видеопотоке (только для камер)
  • CV_CAP_PROP_FRAME_HEIGHT - высота кадров в видеопотоке (только для камер)
  • CV_CAP_PROP_FPS - частота кадров (только для камер)
  • CV_CAP_PROP_FOURCC - 4-символьный код кодека (только для камер).

Первые два вас интересуют.

EDIT: больше информации:)

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

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);
}

Вы можете поместить аналогичный код в каждый раз, когда пользователь нажимает кнопку для перемотки/перемотки видео.

Метод С++ (OpenCV 2 и выше) должен был бы использовать этот метод вместо этого с тем же свойством property_id и значением.

bool VideoCapture::set(int property_id, double value)

Ответ 2

Я думаю, вам нужно будет прочитать весь файл в массиве IplImages, а затем работать через это. Причина в том, что cvQueryFrame - это односторонний процесс, он считывает по одному кадру за раз по порядку. Я не могу думать иначе. В зависимости от длины видеоролика время инициализации может быть не слишком плохим.

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

Ответ 3

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