2013-07-13 3 views
0

Я написал этот кодOpenCV не умеет читать 2 видеокадры одновременно

while (true) 
{ 
    cv::Mat frame1,frame2,dst,temp; 
    if (!input_video.read(frame1)) 
    { 
     fprintf(stderr, "Video has Finished .\n"); 
     getchar(); 
     return -1; 
    } 
    if (!input_video.read(frame2)) 
    { 
     fprintf(stderr, "Video has Finished .\n"); 
     getchar(); 
     return -1; 
    } 
    cv::cvtColor(frame1,frame1,CV_RGB2GRAY) ; 
    cv::cvtColor(frame2,frame2,CV_RGB2GRAY) ; 
    cv::subtract(frame2,frame1,dst); 
    cv::imshow("F1",frame1); 
    cv::imshow("F2",frame2); 
    cv::imshow("dst",dst); 
    cv::waitKey(); 
     } 

и когда я читаю видео (не с камеры, но видео с моего жесткого диска) Frame1, frame2 одинаковы !!!

Я не знаю, почему метод «читать» возвращает тот же кадр для frame2? поэтому вычитаемое изображение всегда является пустой картиной !!!

Должен ли я делать что-то особенное для одновременного чтения последовательных кадров? , например, каждый раз, когда я хочу прочитать другой кадр использовать эту линию, чтобы добраться до этого кадра:

 input_video.set(CV_CAP_PROP_POS_FRAMES,current_frame+1); 

если да, то есть еще один способ не делать этого?!

Благодаря

+0

http://stackoverflow.com/q/11469281/2065121 –

+0

Да, я прочитал, что, но ответы не работали меня ! Я имею в виду, что в этом коде результат всегда равен нулю (даже для ключевых кадров !!!) кажется, что frame1, frame2 всегда один и тот же ... – PsP

ответ

1

Функция input_video.read() не создает новый объект каждый раз, когда вы называете его и возвращает указатель на внутренний буфер cv::VideoCapture. В этом случае, если скопировать первый кадр в cv::Mat объекта, проблема решена:

while (true) 
{ 
    cv::Mat frame,frame1,frame2,dst,temp; 
    if (!input_video.read(frame)) 
    { 
     fprintf(stderr, "Video has Finished .\n"); 
     getchar(); 
     return -1; 
    } 
    frame.assignTo(frame1); 
    if (!input_video.read(frame)) 
    { 
     fprintf(stderr, "Video has Finished .\n"); 
     getchar(); 
     return -1; 
    } 
    frame.assignTo(frame2); 
    cv::cvtColor(frame1,frame1,CV_RGB2GRAY) ; 
    cv::cvtColor(frame2,frame2,CV_RGB2GRAY) ; 
    cv::subtract(frame2,frame1,dst); 
    cv::imshow("F1",frame1); 
    cv::imshow("F2",frame2); 
    cv::imshow("dst",dst); 
    cv::waitKey(); 
     } 
+0

Вам не хватало рамки frame.assignTo (frame2); в вашем коде после того, как мы прочитаем frame2?, поскольку мы зацикливаемся на видеокадрах, в следующей итерации может случиться так, что мы будем читать frame2 вместо frame1?! – PsP

+0

Я изменил его, но не по этой причине, потому что в следующих строках 'cv :: cvtColor (frame2, frame2, CV_RGB2GRAY)' изменяет содержимое 'frame2'. –

+0

+1 и принимаю ответ, только одна вещь, которую вы имеете в виду, каждый раз, когда я читаю кадр, я должен выполнять некоторые вычисления на нем, а затем читать другой, так что это делает метод «читать» для чтения другого кадра? – PsP

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