OpenCV的cvMatchTemplate用法


 首先,參看上圖。假設褐色的大圖爲待測圖片,紅色小圖爲模板圖片。

       1.result中數據的含義。

       模板匹配函數cvMatchTemplate依次計算模板與待測圖片的重疊區域的相似度,並將結果存入映射圖像result當中,也就是說result圖像中的每一個點的值代表了一次相似度比較結果。

      2.result的尺寸大小。

       如圖可知,模板在待測圖像上每次在橫向或是縱向上移動一個像素,並作一次比較計算,由此,橫向比較W-w+1次,縱向比較H-h+1次,從而得到一個(W-w+1)×(H-h+1)維的結果矩陣,result即是用圖像來表示這樣的矩陣,因而圖像result的大小爲(W-w+1)×(H-h+1)。

       3.如何result中獲得最佳匹配區域

       使用函數cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,NULL);從result中提取最大值(相似度最高)以及最大值的位置(即在result中該最大值max_val的座標位置max_loc,即模板滑行時左上角的座標,類似於圖中的座標(x,y)。)

         由此得到:rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height);rect表示的矩形區域即是最佳的匹配區域。


來源:http://034080116.blog.163.com/blog/static/334061912009116498997/


通過一個程序進行了測試了下,上面的說明中有個錯誤的地方。最佳匹配區域的矩形應該使用min_loc來決定,即:

rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height);


效果圖如下:

模板:        要匹配的圖:    匹配結果:

int main() {
	IplImage *src, *temp1, *ftmp;

	if ((src = cvLoadImage("/home/murphy/Pictures/1.jpg", 1)) == 0) {
		return -1;
	}
	if ((temp1 = cvLoadImage("/home/murphy/Pictures/Screenshot-3.png", 1)) == 0) {
		return -1;
	}

	int iwidth = src->width - temp1->width + 1;
	int iheight = src->height - temp1->height + 1;

	ftmp = cvCreateImage(cvSize(iwidth, iheight), 32, 1);
	
	double min_val;
	double max_val;
	CvPoint min_loc;
	CvPoint max_loc;

	cvMatchTemplate(src, temp1, ftmp, 0);
	cvMinMaxLoc(ftmp, &min_val, &max_val, &min_loc, &max_loc, NULL);
	cvRectangle(src, cvPoint(min_loc.x, min_loc.y), 	cvPoint((min_loc.x + temp1->width),(min_loc.y + temp1->height)), CV_RGB(0,255,0), 1);
	cvNamedWindow("src",1);
	cvShowImage("src",src);
	cvWaitKey(0);

	return 0;
}

昨天在另一個帖子裏發現了確定矩形位置是使用的是max_loc,今天又查了下資料,原來這個跟匹配時採用的方法參數有關,具體如下:

  關於參數 method:

      CV_TM_SQDIFF 平方差匹配法:該方法採用平方差來進行匹配;最好的匹配值爲0;匹配越差,匹配值越大。
      CV_TM_CCORR 相關匹配法:該方法採用乘法操作;數值越大表明匹配程度越好。
      CV_TM_CCOEFF 相關係數匹配法:1表示完美的匹配;-1表示最差的匹配。
      CV_TM_SQDIFF_NORMED 歸一化平方差匹配法
      CV_TM_CCORR_NORMED 歸一化相關匹配法
      CV_TM_CCOEFF_NORMED 歸一化相關係數匹配法



發佈了4 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章