Функция Поиска OpenCV / Перемотка Назад
Я пытался найти / реализовать функцию поиска и перемотки назад (для видео (.avi)) используя OpenCV в C++, но я не могу найти способ сделать это, кроме как пройти через весь файл один раз и сохранить каждое изображение. Есть ли другой способ?
любая помощь была бы очень признательна; спасибо заранее!
4 ответов
С помощью 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-символьный код кодека (только для камер).
первые два представляют для вас интерес.
изменить: дополнительная информация:)
вы можете цикл через кадры, просто повторно вызывая упомянутую функцию с различными индексами кадров.
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;