Функция поиска OpenCV / перемотка назад - PullRequest
21 голосов
/ 04 июня 2010

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

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

Ответы [ 4 ]

41 голосов
/ 05 июня 2010

Используя 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);
* +1034 * Пример: * * одна тысяча тридцать пять
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 и выше) будет использовать этот метод вместо того же значения свойства_id и значения.

bool VideoCapture::set(int property_id, double value)
1 голос
/ 30 июля 2018

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

Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;
1 голос
/ 04 июня 2010

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

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

0 голосов
/ 04 июня 2010

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

...