环境
python : 3.6.10
Opencv : 4.1.2
IDE : pycharm
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义函数
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
模板匹配
- 实现思想:
原理和卷积操作很像,模板在原始图像上滑动,计算模板与图像的差别程度
计算差别程度的方法有6种
然后将每次计算的结果放入一个矩阵,作为输出
假设原图是AxB大小,模板是a x b 大小
输出矩阵的大小为 (A-a+1)x(B-b+1)
最后根据指定的计算差别程度的方法得到最佳匹配
值得注意的是它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
实例:
img_rgb = cv2.imread('F:/PycharmProjects/pjm_test/mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('F:/PycharmProjects/pjm_test/mario_coin.jpg', cv2.IMREAD_GRAYSCALE)
cv_show('tem', template)
h, w = template.shape[:2] # 得到模板的高和宽
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold) # 取匹配值大于0.8的坐标
for pt in zip(*loc[:: -1]): # * 表示可选参数
bottom_right = (pt[0] + w, pt[1] + h)
cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 1)
cv_show('img_rgb', img_rgb)