OpenCV的compareHist()函式進行直方圖比較,可得到直方圖的相似程度,OpenCV提供更高階的matchTemplate()函式,計算想搜尋的影像(小圖),在原始影像(大圖)各個位置的直方圖比較值。
以下為matchTemplate()函式的介紹:
我們可以用相同的概念,自行用compareHist()函式,得到影像各個位置的直方圖比對值,之後再找出最相近的位置,但搜尋的時間會增加很多,因此如果要用這概念進行搜索時,建議直接用matchTemplate()函式即可。
void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)
method=CV_TM_SQDIFF
method=CV_TM_SQDIFF_NORMED
method=CV_TM_CCORR
method=CV_TM_CCORR_NORMED
method=CV_TM_CCOEFF
method=CV_TM_CCOEFF_NORMED
當我們的參數為CV_TM_SQDIFF時,計算結果較小時相似度較高,當我們參數為CV_TM_CCORR、CV_TM_CCOEF時,計算結果較大時相似度較高。
當我們得到比較圖後,根據由比較方式,選擇比較圖最小或最大值的地方,就是目標影像的位置。
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
以下程式碼一開始輸入原始圖(大圖)和搜尋目標圖(小圖),呼叫matchTemplate()找出小圖在大圖影像上各個位置的比較值,接著呼叫minMaxLoc()找出最相似的位置並畫出:
#include
#include
using namespace cv;
int main(){
Mat src = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat roiImg = imread("temp.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat displayImg = src.clone();
Mat result;
result.create(src.rows-roiImg.rows+1, src.cols-roiImg.cols+1, CV_32FC1);
matchTemplate(src, roiImg, result, CV_TM_SQDIFF);
double minVal;
Point minLoc;
minMaxLoc(result, &minVal, 0, &minLoc, 0);
rectangle(displayImg, minLoc, Point(minLoc.x+roiImg.cols , minLoc.y+roiImg.rows), Scalar::all(0), 3);
imshow("origin", src);
imshow("roi", roiImg);
imshow("result", displayImg);
waitKey(0);
return 0;
}
转自:http://monkeycoding.com/?p=563