opencv

您所在的位置:网站首页 opencv找图和大漠找图效率 opencv

opencv

2024-07-09 20:06| 来源: 网络整理| 查看: 265

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3