天天看點

OpenCV4學習筆記(19)——模闆比對

本次要整理記錄的内容是:模闆比對。

模闆比對可以說是一種最簡單的模式識别方法,它的實作主要是通過模闆圖像在被比對圖像中的平移,在被比對圖像中逐個區域尋找和模闆圖像相似的區域,如果存在某區域的相似度大于一定的門檻值,則表明該區域和模闆圖像是相比對的。

但是模闆比對這種方式具有很大的自身局限性,首先它利用一個規定好的模闆進行比對,這就導緻了想要比對出來的結果必須在大小和角度上和模闆圖像一模一樣,一旦原圖像中的比對目标發生旋轉或大小變化,就會導緻比對準确率急劇下降。而且模闆圖像在原圖像中進行移動的時候,隻能夠平行地上、下、左、右移動,對于有經過投影變換的圖像,這種模闆比對尋找目标的方式可以說是完全無效的。同時,這種模闆比對方式對于圖像的光照變換是十分敏感的,如果是對同一物體在不同光照環境下拍攝,并進行模闆比對,是很難得出令人滿意的效果,模闆比對隻适用于光照條件影響很小的比對任務,工作條件限制比較嚴格,這也很大的限制了它的應用性。但是對于一些光照不變的圖像,在經過預處理之後,還是可以使用模闆比對的方式來尋找比對目标的。

OpenCV中提供了

matchTemplate(image, templ, result, method,mask)

這個API來實作模闆比對功能。

第一個參數image:輸入的包含比對目标的圖像;

第二個參數templ:進行比對所用的模闆圖像;

第三個參數result:輸出的比對結果,為浮點型的Mat對象,其高度是

find_image.rows - tem_image.rows + 1

,寬度是

find_image.cols - tem_image.cols + 1

第四個參數method:使用的計算像素相似度的方式,主要有三種可選方式

(1)TM_SQDIFF_NORMED:平方不同(歸一化)值在0~1之間,1表示完全不比對,0表示高度比對

(2)TM_CCORR_NORMED:相關性(歸一化),值在0~1之間,1表示高度比對,0表示完全不比對

(3)TM_CCOEFF_NORMED:相關因子(歸一化),值在0~1之間,1表示高度比對,0表示完全不比對

第五個參數mask:使用的掩膜,沒有掩膜的話不用輸入直接使用預設值就可以。

下面給出一個模闆比對的代碼實作:

Mat find_image;
	find_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tyt.png");
	Mat tem_image;
	tem_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tyt_template.png");

	Mat result;
	matchTemplate(find_image, tem_image, result, TM_CCOEFF_NORMED);
	
	int result_h = result.rows;			//find_image.rows - tem_image.rows +1
	int result_w = result.cols;			//find_image.cols - tem_image.cols +1
	float threshold = 0.85;				//判斷是否與模闆相比對的門檻值
	for (int row = 0; row < result_h; row++)
	{
		for (int col = 0; col < result_w; col++)
		{
			float value = result.at<float>(row, col);
			if (value > threshold)			
			{
				Rect rect(col, row, tem_image.cols, tem_image.rows);
				rectangle(find_image, rect, Scalar(0, 0, 255), 2, LINE_AA, 0);
			}
		}
	}
	imshow("find_image", find_image);
           

首先讀入一張待比對圖像和一張模闆圖像,然後通過

matchTemplate()

來得到一個表示相似度的浮點型矩陣,這個矩陣中每一個點都是通過與模闆進行對比後得到的相似度。再後面使用兩個for循環對這個矩陣的所有坐标點進行周遊,擷取每個坐标點的值并與設定的門檻值進行比較,如果該坐标點值(相似度)大于門檻值,說明這裡存在一個與模闆相比對的目标,就将相似性大于門檻值的點作為繪制目标矩形的錨點坐标,也就是矩形左上角的點,将模闆的尺寸作為繪制目标矩形的尺寸,繪制出矩形将目标标記出來。這就實作是對目标的模闆比對操作。具體效果如下:

這是模闆圖像,是從原圖像中裁剪出來的一小塊

OpenCV4學習筆記(19)——模闆比對

然後是待比對圖像

OpenCV4學習筆記(19)——模闆比對

這是比對得到的結果:

OpenCV4學習筆記(19)——模闆比對

可見輸出結果中很好的将待尋找目标給标記了出來,但這是在原圖像進行操作,下面将原圖像通過像素值的添加進行亮度調節後再進行比對,看看效果。

OpenCV4學習筆記(19)——模闆比對

這裡對原圖的像素值都提升了150,雖然圖像内容沒有發生改變,但是像素值一變化,導緻模闆比對操作無法達到之前那麼好的效果了,可見模闆比對的魯棒性是很差的。

總結:對于光照固定的圖像進行目标檢測,可以通過模闆比對來實作,但如果光照等外界因素變化對圖像影響比較大,則模闆比對的效果會大幅下降。模闆比對隻能作為一種基本的、入門的目标檢測方式。

本次整理到此結束,謝謝閱讀。

PS:本人的注釋比較雜,既有自己的心得體會也有網上查閱資料時摘抄下的知識内容,是以如有雷同,純屬我向前輩學習的緻敬,如果有前輩覺得我的筆記内容侵犯了您的知識産權,請和我聯系,我會将涉及到的博文内容删除,謝謝!

繼續閱讀