2013-07-13 50 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(); 
     } 

,当我读的视频(而不是从相机但是从我的硬盘视频)帧1,帧2是相同的!

我不知道为什么“读取”方法返回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