Я пытался найти/реализовать искание и функцию перемотки (для видео (.avi)) использование OpenCV в C++, но я не могу найти способ сделать его кроме прохождения через всего файла однажды и сохранение каждого образа. Есть ли какой-либо другой путь?
Любая справка очень ценилась бы; Спасибо заранее!
Используя cvSetCaptureProperty (), вы можете циклически перебирать кадры в миллисекундах или по порядковому номеру кадра.
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
property_id - это свойство, которое вам необходимо использовать.Это может быть одно из следующих значений:
Первые два вас интересуют.
РЕДАКТИРОВАТЬ: подробнее :)
Вы можете циклически перемещаться по фреймам, просто многократно вызывая упомянутую функцию с различными индексами фреймов.
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)
В библиотеке highgui вы найдете функции для панели поиска (cvCreateTrackbar и друзья).
Я думаю, вам нужно было бы прочитать весь файл в массиве IplImages, а затем работать через это. Причина в том, что cvQueryFrame - односторонний процесс, он читает по одному кадру за раз по порядку. Я не могу придумать другого пути. В зависимости от длины видео время инициализации может быть неплохим.
Панели cvTrackbars, как вы говорите, в основном используются для изменения параметров. Они изменяют значение переменной (заданной как параметр в форме указателя) и вызывают функцию обратного вызова. К сожалению, насколько мне известно, они являются единственными кнопочными элементами в HighGUI