【opencv】单目标模板匹配

模板匹配主要用到了两个函数cv2.matchTemplate() 和 cv2.minMaxLoc()

这两个函数的用法:

1. cv2.matchTemplate(image, templ, result, method)

image: 待搜索图像,必须为8bit 或 32bit float;

templ: 模板,不大于 image 并且与 image 数据类型相同;

result: 返回匹配结果,单通道 32bit float;

method: 指定比较方法。

参数method(匹配方法):

CV_TM_SQDIFF 平方差匹配法:采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR 相关匹配法:采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法

 

2. cv2.minMaxLoc(src, mask=None)

src: 匹配结果矩阵,即上面的result

功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。cv2.minMaxLoc()函数就可全部解决。函数返回的四个值就是上述所要得到的。

3.程序实现参考如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: MP time:2019/8/22

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("C:/Users/user/Desktop/keke.jpg", 1)
image = image[:, :, ::-1]
img2 = image.copy()
templ = image[450:780, 500:830]
print(templ.shape)
print(image.shape)
w, h, c = templ.shape
# cv2.imshow('src', image)
# cv2.waitKey(0)
methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]
for md in methods:  # 这里md print出来的结果是1,3,5,opencv默认这几个函数的代号为1,3,5
	print(md)
	result = cv2.matchTemplate(img2, templ, md)
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
	if md == cv2.TM_SQDIFF_NORMED:
		top_left = min_loc
	else:
		top_left = max_loc
	bottom_right = (top_left[0] + w, top_left[1] + h)
	cv2.rectangle(img2, top_left, bottom_right, (255, 0, 0), 2)

	plt.subplot(221), plt.imshow(image)
	plt.title('src image'), plt.xticks([]), plt.yticks([])
	plt.subplot(222), plt.imshow(templ)
	plt.title('templ image'), plt.xticks([]), plt.yticks([])
	plt.subplot(223), plt.imshow(result, cmap='gray')
	plt.title('result image'), plt.xticks([]), plt.yticks([])
	plt.subplot(224), plt.imshow(img2)
	plt.title('detect image'), plt.xticks([]), plt.yticks([])
	plt.show()



使用图:

 

结果图:

figure1

 

figure2

 

 

 

 

 

figure3

 

 

参考:https://blog.csdn.net/weixin_42081389/article/details/87935735

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值