日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

16-模板匹配

發布時間:2023/12/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 pltdef 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.shape#結果為:(300,300) (h,w)template.shape#結果為:(100,100) (h,w)res = cv2.matchTemplate(img,template,cv2.TM_SQDIFF) res.shape#結果為:(201, 201)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) min_val#結果為:-16.0 max_val#結果為:88739848.0 min_loc#結果為:(99, 60) max_loc#結果為:(61, 0) 差別程度方法名稱效果
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 pltdef 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)#如果是平方差匹配TM_SQDIFF或歸一化平方差匹配TM_SQDIFF_NORMED,取最小值if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse: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 pltdef 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)#模板,0為灰度圖,1為原色 show_photo('template',template) h, w = template.shape[:2]#template.shape為[h,w,c]這里只用h和w即可,c為顏色通道,彩色為3(BGR),灰度圖不顯示res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.8#取匹配程度大于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), 2)show_photo('img_rgb',img_rgb)

原圖:

模板:

匹配多個對象:

總結

以上是生活随笔為你收集整理的16-模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。