我目前正在開發一個項目,此刻我需要從視頻中拉出連續的幀,然後查找並匹配它們上的特徵。問題是,當我調用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代碼。 任何幫助/建議將不勝感激。
你確定兩幅圖像是一樣的嗎?如果它們是連續的幀,它們可能在視覺上相同,但實際上具有非常小的差異。如果這不是問題,這個頁面有一些關於克隆幀圖像的信息(搜索VideoCapture :: read) - http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture – MatthewD 2013-05-03 00:01:58
是的,他們完全一樣,我已經通過圖像來確保。鏈接中的克隆適用於較早的版本,主要處理c IplImage而不是C++ cv :: Mat,它更易於使用。只需設置圖像,然後克隆我設置的變量似乎可以做到這一點,或多或少強制其本身的深層副本。 – 2013-05-03 00:51:10
是的,我發佈我的評論後,我看到了你的答案。我對OpenCV並不熟悉,所以不知道版本之間的差異。只是想我會分享我的5分鐘谷歌研究。很高興你找到你的解決方案。 – MatthewD 2013-05-03 01:32:49