Opencv计算机视觉
一、模板匹配的基本概念
模版匹配:模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。
为了识别匹配区域,我们必须通过滑动来将模板图像与源图像进行比较,它的基本思想是:将模板图像在待搜索图像上滑动,计算模板与待搜索图像中每个对应区域的相似度,最终找到相似度最高的区域。
一次移动一个像素(从左到右,从上到下)。在每个位置,都会计算一个度量(度量计算公式参考OpenCV: Template Matching),以便它表示该位置的匹配"好"或"坏"程度
二、代码逐行解析
- 导入库和读取显示图像
python
import cv2
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
cv2.imshow('kele',kele)
cv2.imshow('template.png',template)
# cv2.waitKey(0)

kele.png

template.png
2.获取模板尺寸并进行模板匹配
python
h,w=template.shape[:2]
res=cv2.matchTemplate(kele,template,cv2.TM_CCOEFF_NORMED)
h,w=template.shape[:2]:获取模板图像的高度(h)和宽度(w)。这两个值将用于后续在匹配位置绘制矩形框。
cv2.matchTemplate(image, templ, method):这是模板匹配的核心函数。
image:待搜索的大图像(kele)。
templ:模板图像(template)。
method:匹配方法。这里使用的是cv2.TM_CCOEFF_NORMED(归一化相关系数匹配法)。
返回值res:一个结果矩阵,其大小为(H-h+1, W-w+1),其中H和W是待搜索图像的高度和宽度。矩阵中的每个元素表示模板在对应位置的匹配程度。
- 处理匹配结果并获取最佳匹配位置
python
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)
cv2.minMaxLoc(res):分析结果矩阵res,返回其中的最小值(min_val)、最大值(max_val)、最小值的位置(min_loc)和最大值的位置(max_loc)
top_left=max_loc:对于TM_CCOEFF_NORMED方法,最大值的位置就是最佳匹配区域的左上角坐标。不同的匹配方法对 "最佳匹配" 的定义不同:
对于TM_SQDIFF和TM_SQDIFF_NORMED,最小值对应最佳匹配。
对于TM_CCORR、TM_CCORR_NORMED、TM_CCOEFF、TM_CCOEFF_NORMED,最大值对应最佳匹配。
bottom_right=(top_left[0]+w,top_left[1]+h):根据模板的宽度和高度,计算出最佳匹配区域的右下角坐标。
4.绘制匹配结果并显示
python
kele_temple=cv2.rectangle(kele,top_left,bottom_right,(0,255,0),2)
cv2.imshow('kele_template',kele_temple)
cv2.waitKey(0)
cv2.rectangle(image, pt1, pt2, color, thickness):在大图像kele上绘制一个矩形框,标记出最佳匹配区域。
pt1:矩形的左上角坐标(top_left)。
pt2:矩形的右下角坐标(bottom_right)。
color:矩形的颜色,这里是绿色((0,255,0))。
thickness:矩形边框的厚度,这里是 2 个像素。
cv2.imshow('kele_template',kele_temple):显示绘制了匹配结果的图像。
cv2.waitKey(0):暂停程序,等待用户按下任意键后关闭所有窗口
三、常用的模板匹配方法
| 方法 | 特点 | 最佳匹配值 |
|---|---|---|
TM_SQDIFF |
平方差匹配法,匹配值越小,匹配度越高 | 最小值 |
TM_SQDIFF_NORMED |
归一化平方差匹配法,对亮度和对比度不敏感 | 最小值 |
TM_CCORR |
相关匹配法,匹配值越大,匹配度越高 | 最大值 |
TM_CCORR_NORMED |
归一化相关匹配法,对亮度和对比度不敏感 | 最大值 |
TM_CCOEFF |
相关系数匹配法,匹配值越大,匹配度越高 | 最大值 |
TM_CCOEFF_NORMED |
归一化相关系数匹配法,对亮度和对比度不敏感,效果通常最好 | 最大值 |
推荐使用归一化的方法(如TM_CCOEFF_NORMED),因为它们对图像的亮度和对比度变化具有更好的鲁棒性