<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
提供一個模板影象,一個目標影象,且滿足模板影象是目標影象的一部分,從目標影象中尋找特定的模板影象的過程,即為模板匹配。OpenCV提供了matchTemplate()方法幫助我們實現模板匹配。
該方法語法如下:
cv2.matchTemplate(image, templ, method, result=None, mask=None)
其中
image 即目標影象
templ 即模板影象
method 是匹配的方式
mask 即掩模,可選。只有當method為cv2.TM_SQDIFF或cv2.TM_CCORR_NORMED時才支援此引數。
method引數可以是以下值:
引數值 | 描述 |
---|---|
cv2.TM_SQDIFF | 差值平方和匹配,也稱平方差匹配。可以理解為是基於差異程度的匹配,差異程度越小,匹配程度越高。完全匹配時值差值平方和為0。 |
cv2.TM_SQDIFF_NORMED | 相關匹配。 可以理解為是基於相似程度的匹配,相似程度越高,計算結果越大,匹配程度就越高。 |
cv2.TM_CCORR | 標準相關匹配。 規則同上。 |
cv2.TM_CCORR_NORMED | 相關係數匹配 |
cv2.TM_CCOEFF | 相關係數匹配。也是基於相似程度的匹配,計算結果是一個-1到1的浮點數,1表示完全匹配,0表示毫無關係,-1表示兩張圖片亮度剛好相反。 |
cv2.TM_CCOEFF_NORMED | 標準相關係數匹配,規則同上。 |
使用matchTemplate()方法,模板會將影象中的每一塊區域都覆蓋一遍,並每次都使用所選的method方法進行計算,每次的計算結果最後以一個二維陣列的形式返回給我們。
為方便展示,特准備以下圖片素材:
選擇世界名畫《三英戰呂布》(test.png),影象shape為(738, 675, 3):
從中摳出一部分影象元素作為下邊要用的模板素材。取材程式碼如下( 不建議截圖,截圖摳出來的不一定能保證尺寸):
import cv2 img = cv2.imread("test.png") print(img.shape) # 電燈 img1 = img[20:220, 320:480, :] # 虎牢關牌匾 img2 = img[75:150, 200:310, :] # 青龍刀 img3 = img[170:530, 575:650, :] # 關雲長 img4 = img[270:670, 160:330, :] cv2.imshow("img0", img) cv2.imshow("img1", img1) cv2.imshow("img2", img2) cv2.imshow("img3", img3) cv2.imshow("img4", img4) cv2.waitKey() cv2.destroyAllWindows() cv2.imwrite('template_pic1.jpg', img1) cv2.imwrite('template_pic2.jpg', img2) cv2.imwrite('template_pic3.jpg', img3) cv2.imwrite('template_pic4.jpg', img4)
取出的模板素材如下:
電燈
虎牢關牌匾
青龍刀
關雲長
單模板匹配,即在匹配時中只使用到一個模板的匹配過程。具體又可以分為單目標匹配和多目標匹配。
單目標匹配,即模板在目標影象中只匹配 匹配程度最高的一個匹配結果。
這需要找出這一次匹配結果所在位置的座標來確定其位置,
OpenCV提供了cv2.minMAXLoc()來實現。
該方法引數為matchTemplate()的返回值,會返回一個元組,元組中有四個值,分別是最小值、最大值、最小值時影象左上角頂點座標,最大值時影象左上角頂點座標。
接下來,使用 電燈(template_pic1) 圖片來匹配原圖,並用紅色的矩形在原影象中圈出模板影象,使用標準差值平方和的匹配方式,程式碼如下:
import cv2 img = cv2.imread("test.png") templ = cv2.imread("template_pic1.jpg") height, width, c = templ.shape results = cv2.matchTemplate(img, templ, cv2.TM_SQDIFF_NORMED) # 獲取匹配結果中的最小值、最大值、最小值座標和最大值座標 minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(results) resultPoint1 = minLoc resultPoint2 = (resultPoint1[0] + width, resultPoint1[1] + height) cv2.rectangle(img, resultPoint1, resultPoint2, (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
如圖所示,成功標出了模板圖。
如果要從多幅影象中,找出與模板最匹配的結果,
以標準差值平方和的匹配方式為例,
則可以對這些影象進行遍歷,並比較每幅影象對應結果中的最小值,找出最小值中的最小值,則為最佳匹配項。
以兩幅影象為例,將原圖翻轉一次,生成一張新的影象(翻轉後結果與原圖較像,但差異巨大)
翻轉產生素材(test1.png)
import cv2 img = cv2.imread("test.png") dst1 = cv2.flip(img, 1) cv2.imshow("dst1", dst1) cv2.waitKey() cv2.destroyAllWindows() cv2.imwrite('test1.png', dst1)
然後使用模板 關雲長 (template_pic4.jpg)對兩幅影象進行匹配,輸出最佳匹配結果,並畫紅框展示:
import cv2 image = [] image.append(cv2.imread("test.png")) image.append(cv2.imread("test1.png")) templ = cv2.imread("template_pic4.jpg") height, width, c = templ.shape # 迴圈變數初始化 # 這裡只是隨便設定一個值,該值並無意義,只是為了定義該變數 # 使用TM_SQDIFF_NORMED計算方法,計算出的結果通常是小於1的,所以minValue可以設定為1。如果是TM_SQDIFF計算方法,則就不行了,計算出來的值會很大。程式碼就不再有效,需要把minMax設得更大,或者做其他修改。 index = -1 minValue = 1 minLoc1 = (0, 0) # 遍歷每幅影象 for i in range(0, len(image)): results = cv2.matchTemplate(image[i], templ, cv2.TM_SQDIFF_NORMED) min = cv2.minMaxLoc(results)[0] if min < minValue: minValue = min minLoc1 = cv2.minMaxLoc(results)[2] index = i minLoc2 = (minLoc1[0] + width, minLoc1[1] + height) cv2.rectangle(image[index], minLoc1, minLoc2, (0, 0, 255), 2) cv2.imshow("result", image[index]) cv2.waitKey() cv2.destroyAllWindows()
如圖,test.png中的關雲長與模板更為匹配。
多目標匹配,即在目標影象中匹配出所有與模板影象匹配的結果。可以使用相關匹配或相關係數匹配。
素材準備
還以原影象"test.png"為參照,
為了產生方便我們做範例的影象,我們在該影象的基礎上多加一盞電燈,生成"test2.png"
import cv2 img = cv2.imread("test.png") templ = cv2.imread("template_pic1.jpg") img[20:220, 30:190, :] = templ cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows() cv2.imwrite('test2.png', img)
多目標匹配
多目標匹配即對matchTemplate()匹配的總的結果,的計算情況資料,使用for迴圈遍歷,並設定一個判斷標準。
如使用標準相關係數(cv2.TM_CCOEFF_NORMED)的方法判斷,如:如果計算值大於0.99,則我們認為匹配成功了。
使用電燈模板"template_pic1.jpg",匹配影象test2.png。並對匹配的結果用紅色的矩形框標記。
程式碼範例如下:
import cv2 img = cv2.imread("test2.png") templ = cv2.imread("template_pic1.jpg") height, width, c = templ.shape # 按照標準相關係數匹配 results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED) for y in range(len(results)): for x in range(len(results[y])): if results[y][x] > 0.99: cv2.rectangle(img, (x, y), (x + width, y + height), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
程式執行結果如下,成功匹配出了兩盞燈。
多模板匹配,即進行了n次單模板的匹配過程。
直接上範例:
在test.png中匹配電燈、青龍刀、虎牢關牌匾、關雲長四個影象模板:
import cv2 def myMatchTemplate(img, templ): height, width, c = templ.shape results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED) loc = list() for i in range(len(results)): for j in range(len(results[i])): if results[i][j] > 0.99: loc.append((j, i, j + width, i + height)) return loc # 讀取原始影象 img = cv2.imread("test.png") # 模板列表 templs = list() templs.append(cv2.imread("template_pic1.jpg")) templs.append(cv2.imread("template_pic2.jpg")) templs.append(cv2.imread("template_pic3.jpg")) templs.append(cv2.imread("template_pic4.jpg")) loc = list() for t in templs: loc += myMatchTemplate(img, t) # 遍歷所有紅框的座標 for i in loc: cv2.rectangle(img, (i[0], i[1]), (i[2], i[3]), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
匹配效果如下:
以上就是Python OpenCV實現影象模板匹配詳解的詳細內容,更多關於Python OpenCV影象模板匹配的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45