原文:https://www.cnblogs.com/gezhuangzhuang/p/10724769.html
原文:https://www.cnblogs.com/FHC1994/p/9123393.html
原文:https://blog.csdn.net/qq_41603898/article/details/82219291
識別技巧:
小圖的選擇,盡可能的選擇最核心的部分,要保證大圖里面每個元素有包含了小圖
小圖特點:小、每個圖都能匹配到、取核心部分
匹配的幾種方式:
1、TM_SQDIFF:平方差匹配;
TM_SQDIFF_NORMED:標准平方差匹配。
利用平方差來進行匹配,最好匹配為0.匹配越差,匹配值越大。
2、TM_CCORR:相關性匹配;
TM_CCORR_NORMED:標准相關性匹配。
采用模板和圖像間的乘法操作,數越大表示匹配程度較高, 0表示最壞的匹配效果。
3、TM_CCOEFF:相關性系數匹配;
TM_CCOEFF_NORMED:標准相關性系數匹配。
將模版對其均值的相對值與圖像對其均值的相關值進行匹配,
1表示完美匹配,-1表示糟糕的匹配,0表示沒有任何相關性(隨機序列)。
總結:隨着從簡單的測量(平方差)到更復雜的測量(相關系數),我們可獲得越來越准確的匹配(同時也意味着越來越大的計算代價)。
說明:
原圖(大圖):big.jpg
模板(小圖):smart.jpg
import cv2 import numpy as np from matplotlib import pyplot as plt # 原文:https://www.cnblogs.com/gezhuangzhuang/p/10724769.html # 原文:https://blog.csdn.net/qq_21840201/article/details/85084621 # 1. 讀入原圖和模板 img_rgb = cv2.imread('big.jpg') img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread('smart.jpg', 0) h, w = template.shape[:2] # 歸一化平方差匹配 res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.8 # 返回res中值大於0.8的所有坐標 # 返回坐標格式(col,row) 注意:是先col后row 一般是(row,col)!!! loc = np.where(res >= threshold) # loc:標簽/行號索引 常用作標簽索引 # iloc:行號索引 # loc[::-1]:取從后向前(相反)的元素 # *號表示可選參數 for pt in zip(*loc[::-1]): right_bottom = (pt[0] + w, pt[1] + h) print(pt) cv2.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2) # 保存處理后的圖片 cv2.imwrite('res.png', img_rgb) # 顯示圖片 參數:(窗口標識字符串,imread讀入的圖像) cv2.imshow("test_image", img_rgb) # 窗口等待任意鍵盤按鍵輸入 0為一直等待 其他數字為毫秒數 cv2.waitKey(0) # 銷毀窗口 退出程序 cv2.destroyAllWindows()
用到的圖片:
big.jpg
smart.jpg