OpenCV ищут функцию/Перемотку

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

Любая справка очень ценилась бы; Спасибо заранее!

22
задан Cenoc 4 June 2010 в 13:39
поделиться

3 ответа

Используя 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)
42
ответ дан 29 November 2019 в 04:33
поделиться

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

0
ответ дан 29 November 2019 в 04:33
поделиться

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

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

1
ответ дан 29 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: