此結果就是利用OpenCV提供的函式cv2.matchTemplate
與cv2.minMaxLoc
所完成的。
cv2.matchTemplate
利用設定的樣本圖,來搜索圖像中相似的特徵物,並回傳一個灰階影像,其中每個像素表示該像素的鄰域與模板的匹配程度。
result = cv2.matchTemplate(image, templ, method[, result[, mask]])
cv2.TM_SQDIFF
、cv2.TM_CCORR
、cv2.TM_CCOEFF
等。method個人比較常用以下三種
歸一化後的平方差,數值介於0到1之間,比較直觀好處理。
cv2.TM_CCOEFF_NORMED
正規化相關性係數,且除本身圖像明亮,只保留圖像分佈,分數越相似
cv2.TM_CCORR_NORMED
正規化相關性係數(correlation),分數越相似
cv2.TM_SQDIFF_NORMED
正規化後的平方差,可以適應原始圖像及模板同時提高亮度的狀況,但只有其中之一的圖像光線調整,仍然會產生問題
cv2.minMaxLoc
找到最大/最小值在哪裡。以它為矩形的左上角,(w,h)為矩形的寬度和高度
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src[, mask])
import cv2
import numpy as np
# 讀取圖檔
img = cv2.imread('./org.jpg')
template = cv2.imread('./temp.png')
# 圖像轉換成灰階
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 框取相似圖,需定義好框的大小,框設定與樣本圖圖片大小一致
h, w = template.shape[:2]
# 指定匹配的方法
method = cv2.TM_SQDIFF_NORMED
# matchTemplate()傳入待匹配圖像和模板圖像、匹配方法,得到的結果是一個單通道的float32浮點類型的圖像
res = cv2.matchTemplate(img_gray, template_gray, method)
# minMaxLoc()計算最佳匹配位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# TM_SQDIFF_NORMED, 此方法要取最小值,代表最佳位置
if method in [cv2.TM_CCOEFF_NORMED, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
#給rectangle框 右下的位置
bottom_right = (top_left[0] + w, top_left[1] + h)
#框取搜尋到的特徵圖
cv2.rectangle(img,top_left, bottom_right, (0,0,255), 1)
# 顯示結果圖像
cv2.imshow('reuslt', img)
cv2.waitKey(0)
cv2.destroyAllWindows()