2013-05-02 51 views
0

我目前正在開發一個項目,此刻我需要從視頻中拉出連續的幀,然後查找並匹配它們上的特徵。問題是,當我調用VideoCapture :: read(Mat &圖片)時,它會覆蓋我想要與同一圖像進行比較的兩幅圖像。我認爲這可能是因爲使用了相同的緩衝區,因此這兩個值都指向相同的空間。我只是不確定如何解決這個問題。在opencv中讀取視頻文件的連續圖像

這裏的問題代碼:(不用擔心可憐的異常處理)

Mat m1, m2; 
VideoCapture cap(argv[1]); 
if(!cap.isOpened()){ 
    throw std::exception("Could not open the file"); 
} 
int num = 0; 

while(num < 20){ 
    try{ 
    cap.read(m1); 
    cap.read(m2); 

    num++; 
    match(m1,m2,num); 

    }catch(std::exception){ 
     std::cout << "Oh no!"; 
    } 
} 

比賽(M1,M2,NUM)做特徵檢測業務,並輸出圖像「Image_%D.JPG 「,第此圖像是兩個圖像並排顯示匹配。儘管這張圖片連續兩次是同一張圖片。 match()確實起作用,因爲我已經用靜止圖像對其進行了測試,所以我相信問題在於cap.read代碼。 任何幫助/建議將不勝感激。

+0

你確定兩幅圖像是一樣的嗎?如果它們是連續的幀,它們可能在視覺上相同,但實際上具有非常小的差異。如果這不是問題,這個頁面有一些關於克隆幀圖像的信息(搜索VideoCapture :: read) - http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture – MatthewD 2013-05-03 00:01:58

+0

是的,他們完全一樣,我已經通過圖像來確保。鏈接中的克隆適用於較早的版本,主要處理c IplImage而不是C++ cv :: Mat,它更易於使用。只需設置圖像,然後克隆我設置的變量似乎可以做到這一點,或多或少強制其本身的深層副本。 – 2013-05-03 00:51:10

+0

是的,我發佈我的評論後,我看到了你的答案。我對OpenCV並不熟悉,所以不知道版本之間的差異。只是想我會分享我的5分鐘谷歌研究。很高興你找到你的解決方案。 – MatthewD 2013-05-03 01:32:49

回答

0

好吧,確保每個圖像都是捕獲圖像的深層副本一樣簡單。

m1 >> cap 
m1 = m1.clone(); 

做了詭計,雖然不如我希望的那麼優雅。

+0

除非你只是在喝醉,否則不是這樣做的。 – 2013-05-03 02:50:33

+0

我沒有在這裏看到任何其他的答案托馬斯。也許你可以提供一些實際的投入,而不是僅僅裝袋。就像我說的那樣,它做我想做的事情,但這是做一件冒險的事情。 – 2013-05-03 10:06:30

+1

OP解決了他自己的問題。沒有必要downvote!如果你不喜歡它,發佈你自己的答案。 +1在這裏進行補償。 – MatthewD 2013-05-07 01:00:05