2016-06-05 3 views
1

Я пытаюсь написать программу, которая захватывает n кадров из видео и помещает их в контейнер для дальнейшей работы (впоследствии я делаю коллаж). Но я столкнулся с проблемой, когда все изображения в контейнере одинаковы (они заполняются только последним захваченным изображением). Я проверил, что изображения захвачены правильно, так как я их также сохраняю и могу очистить, увидев, что они разные.OpenCV, помещая одно и то же изображение в контейнер

Вот мой код:

std::vector<cv::Mat> MY_framelist; //container for captured frames 

cv::VideoCapture myvid; 
cv::Mat MY_frame; //will capture frames here 
myvid.open(pass_filename); //open video file(char* pass_filename=12.mp4) 

if (!myvid.isOpened()) { 
    printf("Capture not open \n"); 
} 

double x_length = myvid.get(CV_CAP_PROP_FRAME_COUNT); //get maxlength of the video 

uint each_frame = uint(x_length)/16; //capture every 16 frames 

    for (uint j = 0, current_frame = 1; (current_frame < x_length) && (j < 16); current_frame += each_frame, j++) 
{ 

     myvid.set(CV_CAP_PROP_POS_FRAMES, current_frame); //set frame 
     myvid.read(MY_frame); // then capture the next one 
     MY_framelist.push_back(MY_frame); //place it into the container 


     std::stringstream frameNum; //generating name for saved images 
     frameNum << j + 1; 
     if (j + 1 <= 9) 
      my_filename += "0"; 
     my_filename += frameNum.str(); 
     my_filename += ".jpg"; 

     cv::imwrite(my_filename.c_str(), MY_frame); //saving images to prove that they are captured correctly 

     my_filename = "test"; 

     printf(" and Image # "); 
     printf("%d", j + 1); 
     printf(" saved \n"); 

    } 

В результате MY_framelist будет содержать 16 те же изображения, которые были захвачены в прошлом. Что я делаю неправильно here? Я видел здесь несколько рабочих мест, но я не очень хочу это сделать, поскольку это приведет к не столь точным результатам. Спасибо заранее!

+0

Может быть, что 'резюме :: Mat' был манипулятором и только то, что обработчик копируется в вектор? – perencia

ответ

1

OpenCV Mat копия мелкая копия, то есть копируется только заголовок, а не данные. Итак, здесь:

MY_framelist.push_back(MY_frame); //place it into the container 

вы получите контейнер с одинаковым изображением.

Вы должны сделать глубокую копию копирование данных, тоже:

MY_framelist.push_back(MY_frame.clone()); //place it into the container 
+0

Спасибо большое! Это решило мою проблему. – Amarula

Смежные вопросы