一、简介 模板匹配是一种最原始,最基本的识别方法,可以在原始图像中寻找出特定图像的位置,模板匹配经常应用于简单的图像查找场景中,例如,在集体合照中找到某个人的位置。 二、模板匹配方法 1、模板是被查找的目标图像,查找模板出现在原始图像中的哪个位置的过程就叫做模板匹配,OpenCV提供的matchTemplate()方法就是模板匹配方法 result = cv2.matchTemplate(image, temp1, method, mask) image:原始图像 temp1:模板图像,尺寸必须小于或者等于原始图像 mask:可选参数,掩模,只有cv2.TM.SQDIFF和cv2.TM_CCORR_NORMED支持此参数,建议采用默认值
method:匹配的方法,参考下表:
?result:计算得出的匹配结果,如果原始图像的宽、高、分别为W、H,模板图像的宽、高分别为w、h,result 就是一个W-w+1,H-h+1行的32浮点型数组,数组中每一个浮点数都是原始图像中对应像素位置的匹配结果,一个一个像素匹配,每次移动一个像素位置,大小为模板区域大小 其含义需要根据method参数来解读 在模本匹配的计算过程中,模板会在原始图像中移动并逐个匹配,模板会与重叠区域内的像素逐个对比,最后将对比的结果保存在模板左上角像素点索引位置对应的数组位置中。
?
?模板移动到原始图像的边缘之后就不回继续移动了,所以模板的移动区域的边长为“原始图像边长-模板边长+1”,最后加1是因为移动区域内的上下,左右的两个边都会被模板覆盖到了,如果不加1就会丢失数据。
?2、单模板匹配
匹配过程中值用到一个模板的场景叫单模板匹配,原始图像中可能只有一个和模板相似的图像,也有可能有多个,如果只获取匹配程度最高的那一个结果,这种操作叫单目标匹配,如果需要同时获取所有匹配程度较高的结果,这种操作叫多目标匹配。 1)单目标匹配 单目标匹配只获取一个结果即可,就是匹配程度最高的结果(如果使用平方差匹配,则为计算出的最小结果,如果使用相关匹配或者相关系数匹配,则为计算出的最大结果) matchTemplate()方法的计算结果是一个二维数组,opencv提供了一个minMaxLoc方法专门用来解析这个二维数组中的最大值,最小值以及这两个值对应的坐标,minmaxLoc()方法的语法如下: minValue,maxValue,minLoc,maxLoc = cv2.minMaxLoc(src,mask) src:matchTemplate()方法计算得出的数组 mask:可选参数,掩模,默认值即可 minValue:数组中的最小值 maxValue:数组中的最大值 minLoc:最小值坐标,格式(x,y) maxLoc:最大值坐标,格式(x,y) 平方差匹配的计算结果越小,匹配程度越高,minMaxLoc()方法返回的minValue值就是模板匹配的最优结果,minLoc就是最优结果区域左上角的点坐标,区域大小与模板大小一致。
2)多目标匹配 多目标匹配需要将原始图像中所有与模板相似的图像都找出来,使用相关匹配或相关系数匹配可以很好的实现这个功能,如果计算结果大于某一值(如:0.99),则认为匹配区域的图案和模板是相同的。 如:使用cv2.TM_CCOEFF_NORMED相关系数匹配进行模板匹配,使用for循环遍历matchTemplate()方法返回的结果,找到所有大于阈值(如:0.99)的计算结果,在这些结果的对应区域位置绘制红色矩形边框。
?编写代码时需要注意,数组的列数在图像坐标系中为横坐标,数组的行数在图像坐标系中为纵坐标
3、多模板匹配
匹配过程中同时查找到多个模板的操作叫多模板匹配,多模板匹配实际上就是进行了n次单模板多目标匹配操作,n的数量为模板总数 每一个模板都需要做一次“单模板多目标匹配”,最后把所有模板的匹配结果汇总到一起,“单模板多目标匹配”的过程可以封装成一个方法,方法参数为模板和原始图像,方法内部将计算结果再加工以下,直接返回所有红框左上角和右下角两点横纵坐标的列表,在方法之外,将所有模板计算得出的坐标汇总到一个列表中,按照这些汇总的坐标一次性把所有红框都绘制出来。 利用多模板匹配能够解决生活中很多实际问题,例如:一个收费停车场有4个车位,车位上陆续地停放了4辆车,通过多模板匹配,能够知晓这4辆车分别停在了哪个车位上。
更多实战案例,请关注作者CSDN其它实战文字
欢迎进群讨论及分享
?
|