与 python-openCv 匹配的简单模板
Posted
技术标签:
【中文标题】与 python-openCv 匹配的简单模板【英文标题】:Simple template matching with python-openCv 【发布时间】:2015-11-25 15:03:39 【问题描述】:我正在尝试在图像中检测一些简单的“红色图案”。这是我遵循的算法: 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)
结果如下:
错误检测:
我的模板图像,我完全从主照片中裁剪出来的:
谁能发现我的错误?我是图像处理的新手。提前致谢。
【问题讨论】:
【参考方案1】:您必须查看您的max_val
并为其设置阈值。
假设图像包含箭头时max_val
为x1
,图像不包含箭头时为x2
,则应该是x1 > x2
。作为第一个暂定值,您可以选择threshold=(x1+x2)/2
,然后如果max_val > threshold
,则在图像中找到图案,否则找不到图案。
原因是matchTemplate
滑过
image
,比较大小为w
的重叠块 \timesh
againsttempl
使用指定的方法并存储 比较结果在result
。
因此,无论图像中是否存在箭头,您的图像 res
将始终具有最大值。
【讨论】:
【参考方案2】:非常感谢亚历山德罗·雅各普森。 我修改了代码并以这种方式解决了问题。这几乎是你提出的:
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 度。 有没有我可以设置的参数,并让算法找到模式,尽管它是旋转或缩放的?
【讨论】:
对于 新问题,您应该提出一个新问题...无论如何,我认为这将与 ***.com/questions/10666436/… 重复,所以请在提出新问题之前问题,阅读答案。以上是关于与 python-openCv 匹配的简单模板的主要内容,如果未能解决你的问题,请参考以下文章