opencv-matchTemplate 之使用场景为大图里面找小图

27 篇文章 0 订阅
2 篇文章 1 订阅

opencv的图片模板匹配方法

【1】matchTemplate 用法介绍
result = cv.matchTemplate( image, templ, method[, result[, mask]] )
image:目标图
templ:模板图
method:原图与样章匹配效果的判别标准,
平方差匹配cv2.TM_SQDIFF:用两者的平方差来匹配,最好的匹配 值为0
归一化平方差匹配cv2.TM_SQDIFF_NORMED
相关匹配cv2.TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
归一化相关匹配cv2.TM_CCORR_NORMED
相关系数匹配cv2.TM_CCOEFF:用两者的相关系数匹配,1表示完美的匹配,-1表示最差的匹配 ,识别率不如其他方法的高 和cv2.TM_CCORR差不多
归一化相关系数匹配cv2.TM_CCOEFF_NORMED

import cv2
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED)
print(result) #输出的是一组数组

【2】minMaxLoc 用法介绍
主要功能是在矩阵里面找大最大值和最小值以及他们对应的索引

import numpy as np
import cv2
a = np.array([[1,2],  [3, 4]])
x = cv2.minMaxLoc(a)
print(x)  #(1.0, 4.0, (0, 0), (1, 1))  

【3】normalize 用法介绍
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None)
src 输入数组;
dst 输出数组,数组的大小和原数组一致;
alpha 用来规范值或者规范范围,并且是下限;
beta 只用来规范范围并且是上限,因此只在NORM_MINMAX中起作用;
norm_type 归一化选择的数学公式类型;
dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同 的地方由dtype决定;
mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作
四种norm_type的区别
cv2.NORM_L1、cv2.NORM_INF、cv2.NORM_L2模式下归一化结果与beta无关,只与alpha有关,详见第4部分的公式说明;
cv2.NORM_MINMAX中alpha、beta都起作用,同时需要注意的是alpha和beta的取值顺序与归一化结果无关。即alpha=255,beta=0和alpha=0,beta=255最后的归一化结果是相同的。

import cv2
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED)
print('归一化之前..........',result)
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1) #归一化
print('归一化之后..........',result)

【4】rectangle 用法介绍
图像上绘制一个简单的矩形。
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → None
img – 图片
pt1 — 矩形的顶点
pt2 — 与pt1相对的点
color -颜色

import cv2
img = cv2.imread('1.png',0) #灰色度显示图片
cv2.rectangle(img,(100,100),(300,200),(0,245,243),2) 
cv2.imshow('blue',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实例1
— 识别率不是100%准确,后续改进中…

import cv2
import numpy as np
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
theight, twidth = template.shape[:2]
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED,-1)
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)    
cv2.rectangle(target, min_loc, (min_loc[0] + twidth, min_loc[1] + theight), (0, 0, 225), 2) 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值,其他的取最大值
cv2.imshow("aa", target)
cv2.waitKey()
cv2.destroyAllWindows()

实例2
看起来比1的识别率要高一些 具体原因是cv2.TM_CCOEFF_NORMED 比TM_SQDIFF_NORMED方法识别率要高些…

import cv2
self.template = cv2.imread('template,png',0)
self.width, self.height = self.template.shape[::-1]  # shape读取图片的三维通道分别是高*宽*颜色
self.target = cv2.imread('tar.png', 0)
res = cv2.matchTemplate(self.target, self.template,cv2.TM_CCOEFF_NORMED)
threshold = 0.9
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
	self.x, self.y = (pt[0] + self.width // 2, pt[1] + self.height // 2)
return self.x, self.y
### 回答1: Java和OpenCV是广受欢迎的开发工具,在图像处理和计算机视觉领域有许多应用。要在一个大图找到一个小图,可以使用Java的javacv库来进行实现。 首先,我们需要加载大图小图。可以使用JavaCV提供的类来读取图像文件并将其转换为Mat对象。Mat是OpenCV表示图像的基本数据结构。 接下来,我们可以使用OpenCV的模板匹配算法来在大图找小图。模板匹配是一种常用的图像匹配方法,它通过在大图上滑动小图,并计算它们的相似度来确定它们之间的匹配程度。 在JavaCV,可以使用matchTemplate方法来执行模板匹配。该方法接受大图小图作为输入,并返回一个结果矩阵。此矩阵的每个元素表示相应位置的小图大图对应位置的相似度。 最后,我们可以遍历结果矩阵,找到最匹配的位置。可以设置一个阈值来确定匹配的程度,从而过滤掉低相似度的匹配。 在实际使用,可以将上述步骤封装为一个方法或类,以便在需要时调用。可以通过调整参数和阈值来优化匹配的准确性。 总之,使用Java和javacv库可以很方便地实现在大图找到小图的功能。这种方法可以在图像处理和计算机视觉应用得到广泛应用,如目标识别、物体检测等。 ### 回答2: 在Java使用JavaCV可以实现在大图找到小图。JavaCV是一个基于OpenCV的Java接口库,它提供了一系列用于图像处理和计算机视觉的函数和类。 首先,我们需要使用JavaCV加载大图小图,并将它们转换为Mat对象。Mat是JavaCV表示图像的数据结构。 然后,我们可以使用OpenCV的模板匹配算法来识别大图出现的小图。模板匹配是一种在图像寻找与给定模板最相似的部分的方法。 在JavaCV,我们可以使用Imgproc.matchTemplate()函数来执行模板匹配操作。该函数接受大图小图的Mat对象作为输入,并返回一个结果矩阵,其每个元素表示小图在对应位置的匹配得分。 接下来,我们可以遍历结果矩阵,找到得分最高的位置,即找到了小图大图的位置。可以使用Core.minMaxLoc()函数来获取最大得分位置的坐标。 最后,我们可以使用Graphics2D(或其他绘图工具)将找到的小图大图标记出来,以便于可视化。 这就是使用JavaCV在大图找到小图的基本过程。当然,可能需要根据具体的应用场景进行一些优化和调整,例如使用不同的匹配算法、设置匹配阈值等。 ### 回答3: 使用Java和JavaCV可以实现在大图找小图的功能。首先,我们需要导入JavaCV库并创建一个JavaCV项目。然后,我们可以使用JavaCV提供的图像处理功能来进行图像匹配。 步骤如下: 1. 将大图小图加载到内存,可以使用JavaCV提供的`imread`函数。 2. 使用JavaCV提供的`matchTemplate`函数,在大图搜索与小图相似的区域。该函数将计算两个图像之间的差异,并返回每个可能匹配点的相似度。 3. 通过比较这些相似度值,可以确定大图小图最相似的区域。可以使用JavaCV提供的`minMaxLoc`函数找到最大或最小的相似度值,并获取相应的位置。 4. 可以使用JavaCV提供的`rectangle`函数在大图标记出找到的最相似区域的位置。 5. 最后,可以将结果保存到文件或在图形界面显示出来。 需要注意的是,在进行图像匹配之前,通常会对图像进行一些预处理,比如调整大小、降噪或者使用滤波器进行图像增强,以提高匹配的准确性。 这就是使用Java和JavaCV进行大图找小图的简单流程。通过利用JavaCV强大的图像处理功能,我们可以很方便地实现这一功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值