Извлечение каждого третьего кадра из видеофайла в opencv С++

Я пишу логику для извлечения каждого 3-го кадра из видео в opencv С++, при выполнении я сталкиваюсь с проблемой в первом цикле for, когда я пытаюсь распечатать (cout) значение 'i' только до 687, после чего Возникает ошибка «Ошибка: недостаточно памяти (не удалось выделить 2764804 байта) из памяти».

int main(){

string path = "C:/vid_frames/Highway_Hamilton.avi";
VideoCapture capture(path); 

Mat matImage[1000];


cout<<"initalization done";

//obtaining frames from the video into matimage variable

for(int i=0;i<1000;i++) {

    char filename[30]="Existing frame";

    capture >> matImage[i];

    cout<<"i:"<<i;

    if ( matImage[i].empty()) 
    {
         cout << "Cannot load image!,runnig application might abort exit,press any key:" << endl;
        getchar();
    }

    char frame_id[30];
    itoa(i, frame_id, 15);
    strcat(filename, frame_id);
}

int num=0;

for(int i=0;num<1000;i++) {

    char filename[30]="Required frame";

    char frame_id[30];
    itoa(num, frame_id, 10);
    strcat(filename, frame_id);

    num=num+3;
}
} 

предложите мне, как я могу получить доступ к массиву переменных Mat за пределами 687, и любезно дайте мне знать, существует ли какая-либо другая логика для извлечения каждого третьего кадра из видео, чтобы я мог выйти из этой проблемы, решение этой проблемы, безусловно, заметно. заранее спасибо.


person Santhosh    schedule 13.03.2014    source источник
comment
вы пытаетесь кэшировать 1000 изображений на 2,7 МБ в памяти? Почему ? что вы пытаетесь сделать с каждым третьим кадром на самом деле?   -  person berak    schedule 13.03.2014


Ответы (1)


Вы можете использовать макрос CV_CAP_PROP_POS_FRAMES, чтобы установить положение кадра, которое будет декодировано/захвачено следующим.

Нравиться,

VideoCapture::set(CV_CAP_PROP_POS_FRAMES ,framePosition);

Дополнительные сведения см. в документе OpenCV.

person Haris    schedule 13.03.2014
comment
эй, харис, спасибо, что ответил так быстро, ты имеешь в виду, что мне нужно использовать функцию VideoCapture::set(int propId, double value) для извлечения каждого 3-го кадра. например, выполнив: VideoCapture::set(CV_CAP_PROP_POS_FRAMES,3), это сработает, верно? Пожалуйста, поправьте меня, если я изношен. Еще раз спасибо. - person Santhosh; 13.03.2014
comment
Либо пропустите кадр после чтения, либо используйте описанный выше метод, я не проверял выше, попробуйте сами. - person Haris; 13.03.2014