OpenCV 模板匹配

2022-03-02 11:21:58 字數 2709 閱讀 6620

模板匹配和卷積原理很像,模板在原影象上從原點開始滑動,計算模板與(影象被模板覆蓋的地方)的差別程度,這個差別程度的計算方法在opencv裡有6種,然後將每次計算的結果放入乙個矩陣裡,作為結果輸出。假如原圖形是axb大小,而模板是axb大小,則輸出結果的矩陣是(a-a+1)x(b-b+1)

tm_sqdiff_normed:計算歸一化平方不同,計算出來的值越接近0,越相關

tm_ccorr_normed:計算歸一化相關性,計算出來的值越接近1,越相關

tm_ccoeff_normed:計算歸一化相關係數,計算出來的值越接近1,越相關

公式:

#

模板匹配

效果:

(263, 263)

(110, 85)

res = cv2.matchtemplate(img, template, cv2.tm_sqdiff) #

也可以寫數字

res.shape

效果:

(154, 179)

min_val, max_val, min_loc, max_loc = cv2.minmaxloc(res) #

最大值、最小值、最大值座標、最小值座標

min_val

max_val

min_loc

max_loc

效果:

39168.0

74403584.0(107, 89)

(159, 62)

for meth in

methods:

img2 =img.copy()

#匹配方法的真值

method =eval(meth)

#print (method)

res =cv2.matchtemplate(img, template, method)

min_val, max_val, min_loc, max_loc =cv2.minmaxloc(res)

#如果是平方差匹配tm_sqdiff或歸一化平方差匹配tm_sqdiff_normed,取最小值

if method in

[cv2.tm_sqdiff, cv2.tm_sqdiff_normed]:

top_left =min_loc

else

: top_left =max_loc

bottom_right = (top_left[0] + w, top_left[1] +h)

#畫矩形

cv2.rectangle(img2, top_left, bottom_right, 255, 2)

plt.subplot(121), plt.imshow(res, cmap='

gray')

plt.xticks(), plt.yticks()

#隱藏座標軸

plt.subplot(122), plt.imshow(img2, cmap='

gray')

plt.xticks(), plt.yticks()

plt.suptitle(meth)

plt.show()

效果:

#取匹配程度大於%80的座標

loc = np.where(res >=threshold)

for pt in zip(*loc[::-1]): #

*號表示可選引數

bottom_right = (pt[0] + w, pt[1] +h)

cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 1)

cv2.imshow(

'img_rgb

', img_rgb)

cv2.waitkey(0)

效果:

OpenCV模板匹配

include include opencv2 opencv.hpp using namespace std using namespace cv int main int argc,char argv load reference image img imread argv 1 always ch...

opencv模板匹配

模板匹配是一種用於在源影象s中尋找定位給定目標影象t 即模板影象 的技術。其原理很簡單,就是通過一些相似度準則來衡量兩個影象塊之間的相似度similarity s,t 2.用途 模板匹配方法常用於一些平面影象處理中,例如印刷中的數字 工業零器件等小尺寸目標影象識別分類。3.方法 模板匹配中,源影象和...

模板匹配opencv

模板匹配,就是在一幅影象中尋找另一幅模板影象最匹配 也就是最相似 的部分的技術。說的有點抽象,下面給個例子說明就很明白了。在上面這幅全明星照中,我們想找出姚明頭像的位置,並把它標記出來,可以做到嗎?可以,這就是模板匹配的要做的事情。其實模板匹配實現的思想也是很簡單很暴力的,就是拿著模板 姚明頭像 在...