2015-05-13 73 views
1

我是計算機視覺的初學者。我目前正在開發一個項目,在iOS中使用matchTemplate來查找兩個圖像之間的匹配。我面臨的問題是找到一種方法來確定兩個圖像是否匹配儘管matchTemplate運行良好。我想到了採用結果矩陣的百分比,但我不知道如何也找不到方法,並且MinMaxLoc也沒有和我一起工作。 如果任何人都可以幫助我或給我一個想法,我真的很感激它,因爲我現在處於絕望的境地。 這裏是代碼: `如何獲得模板匹配代碼的結果?

UIImage * image1 = [UIImage imageNamed:@「1.png」]; UIImage * image2 = [UIImage imageNamed:@「Image002.png」];

// Convert UIImage* to cv::Mat 
UIImageToMat(image1, MatImage1); 
UIImageToMat(image2, MatImage2); 


MatImage1.resize(100 , 180); 
MatImage2.resize(100 , 180); 



if (!MatImage1.empty()) 
{ 
    // Convert the image to grayscale 
    //we can also use BGRA2GRAY : Blue , Green , Red and Alpha(Opacity) 
    cv::cvtColor(MatImage1, grayImage1, cv::COLOR_BGRA2GRAY); 
    cv::cvtColor(MatImage2, grayImage2, cv::COLOR_BGRA2GRAY); 


} 


/// Create the result matrix 
int result_cols = grayImage1.cols ; 
int result_rows = grayImage1.rows ; 

result.create(result_cols, result_rows, CV_32FC1); 

/// Do the Matching and Normalize 
matchTemplate(grayImage1 , grayImage2 , result , CV_TM_SQDIFF_NORMED); 

//Normalize 
normalize(result, result, 0, 100, cv::NORM_MINMAX, -1); 

//Threshold 
cv::threshold(result , result , 30, 0, CV_THRESH_TOZERO);` 

回答

0

matchTemplate(...)的意圖是模板通常比圖像小。然後該模板作爲滑動窗口在圖像上移動,並且以某種方式計算「匹配分數」。使用互相關或平方差。

因此,如果輸入圖像是10x10,模板是3x3,那麼模板的位置應使左上角位於圖像的左上角(模板的中心位於像素(1,1)處我們從0開始索引)。計算匹配分數,然後模板滑動到(1,2),我們再次匹配。當模板的中間像素位於(8,1)處時,我們將其滑動到下一行(1,2)並重復。

該過程的輸出結果是一個8x8矩陣,其中每個位置的值代表模板在該點時的匹配分數。輸出圖像的大小是W-w + 1 x H-h + 1,其中WxH是圖像的大小,wxh是模板的大小。

然後,您可以使用minMaxLoc來確定輸出矩陣中哪些是最高和最低分數,並且根據您使用的匹配分數,其中之一將最有可能與圖像內的模板相匹配。

現在你調整你的模板和圖像大小相同:

MatImage1.resize(100 , 180); 
MatImage2.resize(100 , 180); 

這意味着,世界上只有一個地方,模板可位於圖像內部和您的輸出矩陣應該是一個1x1格。

您同時還使用

CV_TM_SQDIFF_NORMED 

這是標準化的平方差。對於這個分數,較低的匹配分數更好。即1x1輸出矩陣中的值越接近0,模板和圖像之間的匹配越接近。

鑑於模板和圖像的尺寸是100x180,那麼您可以很容易地計算出匹配分數可以達到的最大值,如果整個圖像是黑色,模板是白色的,或者反之亦然,您會得到100x180x255。這應該可以幫助你找出一個合理的閾值,低於這個閾值你會說t =你的模板與圖像匹配。

由於您只有1x1輸出,儘管在歸一化或閾值結果方面沒有多大價值。

相關問題