生活随笔
收集整理的這篇文章主要介紹了
16-模板匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
cv2.matchTemplate(img,template,cv2.TM_SQDIFF)
參數一:原圖圖像對象名稱
參數二:模板圖像對象名稱
參數三:差別程度的計算方法(六選一推薦使用帶歸一化的)
模板匹配和卷積原理很像,模板從原圖像上從原點開始滑動,計算模板與(圖像被模板覆蓋的地方)的差別程度,這個差別程度的計算方法在opencv中有六種,然后將每次計算的結果放入一個矩陣里,作為結果輸出。
假如原圖像是A×B的大小,而模板是a×b的大小,則輸出結果的矩陣是(A-a+1)×(B-b+1)
import cv2
import numpy
as np
from matplotlib
import pyplot
as plt
def show_photo(name
,picture
):cv2
.imshow
(name
,picture
)cv2
.waitKey
(0)cv2
.destroyAllWindows
()img
= cv2
.imread
('E:\Jupyter_workspace\study\data/A.jpg',0)
template
= cv2
.imread
('E:\Jupyter_workspace\study\data/Aa.jpg',0)
h
, w
=template
.shape
[:2]img
.shapetemplate
.shaperes
= cv2
.matchTemplate
(img
,template
,cv2
.TM_SQDIFF
)
res
.shapemin_val
, max_val
, min_loc
, max_loc
= cv2
.minMaxLoc
(res
)
min_val
max_val
min_loc
max_loc
差別程度方法名稱效果
| TM_SQDIFF | 計算平方不同,計算出來的值越小,越相關 |
| TM_CCORR | 計算相關性,計算出來的值越大,越相關 |
| TM_CCOEFF | 計算相關系數,計算出來的值越大,越相關 |
| TM_SQDIFF_NORMED | 計算歸一化平方不同,計算出來的值越接近0,越相關 |
| TM_CCORR_NORMED | 計算歸一化相關性,計算出來的值越接近1,越相關 |
| TM_CCOEFF_NORMED | 計算歸一化相關系數,計算出來的值越接近1,越相關 |
盡量用后三個歸一化操作效果更好
六種具體差別程度公式參考手冊
import cv2
import numpy
as np
from matplotlib
import pyplot
as plt
def show_photo(name
,picture
):cv2
.imshow
(name
,picture
)cv2
.waitKey
(0)cv2
.destroyAllWindows
()img
= cv2
.imread
('E:\Jupyter_workspace\study\data/A.jpg',0)
template
= cv2
.imread
('E:\Jupyter_workspace\study\data/Aa.jpg',0)
show_photo
('img',img
)
show_photo
('template',template
)
h
, w
=template
.shape
[:2]methods
= ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
res
= cv2
.matchTemplate
(img
,template
,cv2
.TM_SQDIFF
)
min_val
, max_val
, min_loc
, max_loc
= cv2
.minMaxLoc
(res
)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
)if method
in [cv2
.TM_SQDIFF
, cv2
.TM_SQDIFF_NORMED
]:top_left
= min_loc
else:top_left
= max_locbottom_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
()
原圖:
模板:
匹配多個對象
上面的模板匹配原圖中只有一個模板的存在
下面進行匹配原圖中存在多個模板,進行多個對象的匹配
import cv2
import numpy
as np
from matplotlib
import pyplot
as plt
def show_photo(name
,picture
):cv2
.imshow
(name
,picture
)cv2
.waitKey
(0)cv2
.destroyAllWindows
()img_rgb
= cv2
.imread
('E:\Jupyter_workspace\study\data/mario.jpg')
show_photo
('img_rgb',img_rgb
)
img_gray
= cv2
.cvtColor
(img_rgb
, cv2
.COLOR_BGR2GRAY
)
template
= cv2
.imread
('E:\Jupyter_workspace\study\data/mario_1.jpg',0)
show_photo
('template',template
)
h
, w
= template
.shape
[:2]res
= cv2
.matchTemplate
(img_gray
, template
, cv2
.TM_CCOEFF_NORMED
)
threshold
= 0.8
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), 2)show_photo
('img_rgb',img_rgb
)
原圖:
模板:
匹配多個對象:
總結
以上是生活随笔為你收集整理的16-模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。