微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 7 段图像上正确地进行模板匹配?

如何解决如何在 7 段图像上正确地进行模板匹配?

我有一个 7-segment 图像和一个模板,我尝试进行模板匹配,但是提供的模板没有匹配,您能告诉我如何改进匹配吗?

  • 模板是否应该与要在图像中检测到的所需图案 100% 相同?

Template

Image

import numpy as np
import matplotlib.pyplot as plt
import cv2

R = cv2.imread('image.png')
R = cv2.Canny(R,50,200)

template = cv2.imread('templ.png',0)
template = cv2.Canny(template,200)

h,w = template.shape

res = cv2.matchTemplate(R,template,cv2.TM_CCOEFF_norMED)

threshold = 0.8

loc = np.where( res >= threshold)
for pt in zip(*loc):
    cv2.rectangle(R,pt,(pt[0] + w,pt[1] + h),200,2)

plt.subplot(221)
plt.imshow(R,cmap='gray')
plt.subplot(222)
plt.imshow(template,cmap='gray')
plt.show()

解决方法

您的结果将取决于您用于模板匹配的方法,因为在您的情况下,这些值是二进制的(0 或 255),我希望互相关能很好地工作,我试过了,瞧:

Result using cv2.TM_CCORR

似乎没有很好地记录每种方法的工作原理。

但是对于这些问题,一个很好的调试方法是查看匹配的结果以查看它给出最大值的位置,在您的情况下是 res 变量。

我遵循了 this 网站上的教程,我的最终代码是:

import numpy as np
import matplotlib.pyplot as plt
import cv2

R = cv2.imread('image.png')
R = cv2.Canny(R,50,200)


template = cv2.imread('templ.png',0)
template = cv2.Canny(template,200)
w,h = template.shape[::-1]


res = cv2.matchTemplate(R,template,cv2.TM_CCORR )
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(R,top_left,bottom_right,255,2)

cv2.imwrite( './result.png',R)
,

以高可靠性识别这些良好的二值化数字相当容易:在段的位置上设置 7 个感兴趣的区域并检查白色的数量。这会告诉您该段是打开还是关闭。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。