繁体   English   中英

与python-openCv匹配的简单模板

[英]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则在图像中找到图案,否则找不到图案。

原因是matchTemplate

滑过image ,使用指定的方法将大小w \\ times h的重叠块与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM