2013-07-13 49 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