[英]Simple template matching with python-openCv
我正在尝试检测图像中一些简单的“红色图案”。 这是我遵循的算法:1)滤除所有其他颜色,而不是“红色”,并创建黑色和白色图像。 我使用了带有适当遮罩的“ cvtColor”,然后应用了“ GaussianBlur”以减少噪声。 到目前为止,一切都很好。
2)我使用如下的功能“ matchTemplate”来检测图像中的“箭头”模板。
问题 :照片中有“箭头”模板时,可以正确检测到它。 但是当它不在照片中时,算法会检测到其他形状,这是错误的。 有人可以修改代码,以便当箭头模板不在图片中时什么也没检测到。 这是我的代码:
template = cv2.imread(address,0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(self.image['blured'], template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(self.image['blured'],top_left, bottom_right, 255, 2)
cv2.rectangle(self.image['normal'], top_left, bottom_right, 255,2)
我的模板图片是我从主照片中精确裁剪出来的:
有人可以发现我的错误吗? 我是图像处理的新手。 提前致谢。
您必须查看您的max_val
并为其设置一个阈值。
假设max_val
在图像中包含箭头时为x1
,在图像中不包含箭头时为x2
,应该为x1 > x2
。 作为第一个暂定值,您可以选择threshold=(x1+x2)/2
,然后如果max_val > threshold
则在图像中找到图案,否则找不到图案。
滑过
image
,使用指定的方法将大小w
\\ timesh
的重叠块与templ
比较,并将比较结果存储在result
。
因此, res
图像中是否存在箭头,您的图像res
将始终具有最大值。
非常感谢Alessandro Jacopson。 我修改了代码并以这种方式解决了问题。 几乎是您提出的建议:
template = cv2.imread(address,0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(self.image['blured'], template,cv2.TM_CCOEFF_NORMED)
threshold = 0.9
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(self.image['blured'], pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv2.rectangle(self.image['normal'], pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
通过这种方式,可以非常准确地检测出图案。 新问题:对方向和旋转敏感。 旋转时不会检测到图案,例如大约45度。 尽管可以旋转或缩放比例,但是我可以设置任何参数,并使算法找到模式吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.