如何在 7 段图像上正确进行模板匹配?
How to do template matching corrctly on the 7-Segments images?
我有一张7-segment
图片,还有一个模板,我试过做模板匹配,但是提供的模板没有匹配,请问如何改进匹配?
- 模板是否应该与图像中要检测的所需图案 100% 相同?
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, 50, 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),我希望互相关能很好地工作,我试过了,结果:
似乎没有很好地记录每种方法的工作原理。
但是解决这些问题的一个很好的调试方法是查看匹配结果,看看它在哪里给出了最大值,在你的例子中是 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, 50, 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 个感兴趣区域并检查白色的数量。这会告诉您该段是打开还是关闭。
我有一张7-segment
图片,还有一个模板,我试过做模板匹配,但是提供的模板没有匹配,请问如何改进匹配?
- 模板是否应该与图像中要检测的所需图案 100% 相同?
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, 50, 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),我希望互相关能很好地工作,我试过了,结果:
似乎没有很好地记录每种方法的工作原理。
但是解决这些问题的一个很好的调试方法是查看匹配结果,看看它在哪里给出了最大值,在你的例子中是 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, 50, 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 个感兴趣区域并检查白色的数量。这会告诉您该段是打开还是关闭。