目錄
問題引入
單模板匹配
①模板匹配函數(shù):
②查找最值和極值的坐標(biāo)和值:
整體流程原理介紹
實(shí)例代碼介紹:
多模板匹配
①定義閾值
②zip函數(shù)
整體流程原理介紹
實(shí)例代碼:
問題引入
下面有請我們的陶大郎登場
這張圖片是我們的陶大郎,我們接下來將利用陶大郎來介紹我們的模板匹配
我們想要在原圖中標(biāo)記出陶大郎的耳朵,但是又不想手工標(biāo)記,想要自動標(biāo)記,這該怎么辦呢?
這時候就要利用我們的新知識 模板匹配
模板匹配:能夠利用我們現(xiàn)有的圖片模板,在原圖上自動找到我們想要標(biāo)記的位置
單模板匹配
首先 我們先截取陶大郎的耳朵來作為我們的模板
這個耳朵就是我們的模板圖像,從原圖上截取下來的
我們先介紹我們要使用的函數(shù):
①模板匹配函數(shù):
cv2.matchTemplate(image, templ, method )
- image 為原始圖像。
- templ 為模板圖像。它的尺寸必須小于或等于原始圖像,并且與原始圖像具有同樣的類型。
- method 為匹配方法。有6種可能的值
例子:
method 可填寫對應(yīng)數(shù)值,也可以直接寫參數(shù)值
res = cv2.matchTemplate(img, template, 3) res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF_NORMED)
②查找最值和極值的坐標(biāo)和值:
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc( src?)
minVal:最小值
maxVal:最大值
minLoc:最小值坐標(biāo)
maxLoc:最大值坐標(biāo)
整體流程原理介紹
實(shí)例代碼介紹:
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("hui.jpg",0)
template = cv2.imread("fihui.jpg",0)
# 獲取模板的高和寬
h, w = template.shape[:2]
# 模板匹配
res = cv2.matchTemplate(img, template, 3)
# 定位
# min_val 最小值
# min_loc 最小值坐標(biāo)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
fondsite = cv2.rectangle(img, top_left, bottom_right, 255, 2)
cv2.imshow("fondsite",fondsite)
cv2.waitKey()
cv2.destroyAllWindows()
這里咱們的top_left = max_loc選用的max_loc是因?yàn)槲覀兊哪0迤ヅ涫褂玫?序號3的,使用了歸一化,那當(dāng)然是越大越大,表示近似度越高!
我們運(yùn)行看看效果
我們可以看到陶文輝的耳朵被圈起來了!
多模板匹配
多模板匹配咱們就用陶大郎的眼睛吧!
重點(diǎn)代碼函數(shù)解釋:
①定義閾值
# 取匹配程度大于%97的坐標(biāo)
# 定義的閾值 threshold
threshold = 0.97
# np.where返回的坐標(biāo)值(x,y)是(h,w)
loc = np.where(res >= threshold)
我們添加了threshold來表示我們的相似度
通過np.where篩選出相似度大于97%的部分放入loc
重點(diǎn)!!!!!:此時loc里面存放的格式是((x1,x2,...),(y1,y2,....)) 這樣的格式
②zip函數(shù)
for top_left in zip(*loc[::-1]):
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, 255, 1)
這里唯一個點(diǎn)就是這個zip(*loc[::-1]) 是干嘛的?
他其實(shí)就是把我們的loc的格式從 ((x1,x2,...),(y1,y2,....)) 變成了((x1,y1),(x2,y2),(x3,y3),..)
然后依次把(x1,y1)放入top_left中進(jìn)行遍歷畫出我們的框
整體流程原理介紹
實(shí)例代碼:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("hui.jpg", 0)
template = cv2.imread("eye.jpg", 0)
# 獲取模板的高和寬
h, w = template.shape[:2]
# 模板匹配
res = cv2.matchTemplate(img, template, 3)
# 取匹配程度大于%97的坐標(biāo)
# 定義的閾值 threshold
threshold = 0.97
# np.where返回的坐標(biāo)值(x,y)是(h,w)
loc = np.where(res >= threshold)
for top_left in zip(*loc[::-1]):
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, 255, 1)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行我們會發(fā)現(xiàn)有很多個標(biāo)記框
這是為什么?
文章來源:http://www.zghlxwxcb.cn/news/detail-813380.html
其實(shí)這個是咱們圖片的問題,我的這個圖片比較模糊,是當(dāng)時截圖截下來的,有很多噪音點(diǎn),所以圖片質(zhì)量不太行,導(dǎo)致它覺得陶大郎的眼睛有很多個,但其實(shí)只有兩個文章來源地址http://www.zghlxwxcb.cn/news/detail-813380.html
到了這里,關(guān)于Opncv模板匹配 單模板匹配 多模板匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!