OpenCV for Python之模板匹配
Opencv4 官方文档 : https://docs.opencv.org/4.2.0/
Opencv4 for Python中文文档点击下载:OpenCV4 for Python 中文文档
1 模板匹配
在整个图像区域发现与给定子图像匹配的小块区域具体实现为在待检测的图像上,从左到右,从上倒下计算模板图像与重叠子图像匹配度,匹配度越大,两者相同的可能性越大,例如滑动验证码的缺口小图与缺口大图。
2 api及其参数
cv.matchTemplate(image, templ, method, result=None, mask=None)
参数:
- image: 输入图片1,图中包含模板的图片;
- templ: 输入图片2,模板图片。size必须小于image;
- method:采用何种匹配方式;
- result:比较结果的映射图像,必须是单通道32位浮点格式;
- mask: 搜索模板的mask(不知道咋翻译会好一点),它必须与templ具有相同的类型和大小。 默认情况下未设置。 当前,仅支持#TM_SQDIFF和#TM_CCORR_NORMED方法。
3 常见匹配方式及其计算公式
不深研究…
4 匹配单个物体
为了展示 效果,这里先将原图和模板放出
image:
templates:
demo:
def template_demo():
tpl = cv.imread("./files/images/match2.png")
target = cv.imread("./files/images/match1.png")
methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED] # 只测试这三种模板匹配方法
th, tw = tpl.shape[:2] #取长宽
for md in methods:
print(md)
result = cv.matchTemplate(target, tpl, md) # 得到匹配结果
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
if md == cv.TM_SQDIFF_NORMED: # cv.TM_SQDIFF_NORMED最小时最相似,其他最大时最相似
tl = min_loc
else:
tl = max_loc
br = (tl[0] + tw, tl[1] + th)
cv.rectangle(target, tl, br, (0, 0, 255), 2) # tl为左上角坐标,br为右下角坐标,从而画出矩形
cv.imshow("match-"+np.str(md), target)
result:
5 匹配多个物体
iamge:
temp:
demo:
def template_demo_more():
img_rgb = cv.imread('./files/images/temp1.jpg')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('./files/images/temp2.jpg', 0)
h, w = template.shape[:2]
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold) # 匹配程度大于%80的坐标y,x
print(loc)
for pt in zip(*loc[::-1]): # *号表示可选参数
right_bottom = (pt[0] + w, pt[1] + h)
cv.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)
cv.imshow("more",img_rgb)
result:
转载请注明转自:https://leejason.blog.csdn.net/article/details/106450141