openCV: как разбить видео на последовательность изображений?
Используя opencv, как можно разделить видео на последовательность изображений?
Как я могу разделить его так, чтобы на выходе была последовательность изображений?
2 ответа
К моему удивлению, я не смог найти ответ на этот вопрос на StackoverFlow.
В настоящее время я использую OpenCV 2.1. Это может быть немного старым, но это работает как шарм. Программа прочитает входной файл и создаст последовательность изображений в текущей папке с именем *frame_xx.jpg*
#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
if (argc < 2)
{
printf("!!! Usage: ./program <filename>\n");
return -1;
}
printf("* Filename: %s\n", argv[1]);
CvCapture *capture = cvCaptureFromAVI(argv[1]);
if(!capture)
{
printf("!!! cvCaptureFromAVI failed (file not found?)\n");
return -1;
}
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
printf("* FPS: %d\n", fps);
IplImage* frame = NULL;
int frame_number = 0;
char key = 0;
while (key != 'q')
{
// get frame
frame = cvQueryFrame(capture);
if (!frame)
{
printf("!!! cvQueryFrame failed: no frame\n");
break;
}
char filename[100];
strcpy(filename, "frame_");
char frame_id[30];
itoa(frame_number, frame_id, 10);
strcat(filename, frame_id);
strcat(filename, ".jpg");
printf("* Saving: %s\n", filename);
if (!cvSaveImage(filename, frame))
{
printf("!!! cvSaveImage failed\n");
break;
}
frame_number++;
// quit when user press 'q'
key = cvWaitKey(1000 / fps);
}
// free resources
cvReleaseCapture(&capture);
return 0;
}
Даже после моих правок вопрос больше напоминает требование "отправить мне кодекс", чем типичный вопрос Stackru, в котором ОП предоставляет подробную информацию и демонстрирует, что он или она действительно задумался над этим.
Так что я просто дам "половинный ответ"... В любом случае, я только в меру знаком с модулем машинного обучения OpenCV и едва знаком с остальной частью библиотеки.;-)
Короче говоря, псевдокод должен выглядеть так, и для реализации обычно требуются упомянутые методы OpenCV.
myCapt = cvCreateFileCapture("myInput.avi") // Assuming the feed is from a file.
while (there are frames and we still want them)
cvGrabFrame(myCapt)
myImg = cvRetrieveFrame(myCapt)
// alternatively to cvGrabFrame + cvRetrieveFrame, could use cvQueryFrame()
// save the file (or do something with it...)
cvSaveImage("some_file_name_with_seq_nr", myImage)
cvReleaseCapture(capture)
Как указывалось выше, требуется много синтаксической и логической работы (например, выяснение того, когда останавливаться, создание имени файла отдельных кадров и, конечно, правильное объявление переменных и использование правильного уровня косвенности со всеми указателями;-), Конечно, некоторые из них становятся проще, если вы используете интерфейс Python.
Чтение и запись изображений и видео Страница документации OpenCV, предоставляет более подробную информацию об отдельных методах.