我有一张图片:
我想找问题编号,即:
所以,一般来说,对于正常的形状,我可以为这个人使用形状检测或模板匹配:
但是,该地区有数字。
有人知道这种情况吗?
Opencv:3.2.0
Python:2.7.10
修改1
以下是模板匹配的代码:
#!/usr/bin/env python
import cv2
import numpy as np
img_rgb = cv2.imread('papere1.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('no.png',0)
#template = cv2.imread('2.jpg',0)
#template = cv2.imread('papere3.jpg',0)
#cv2.imshow('origin',img_rgb)
#cv2.waitKey(0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.4
loc = np.where( res >= threshold)
print loc
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv2.imshow('Detected',img_rgb)
cv2.waitKey(0)
这是模板png:
但是,只有在我设置阈值< 0.45,甚至这个目标也不准确......
修改2
上面的代码设置阈值为0.6,我得到了这个:
所以,看起来不错,但我们可以看到6号目标被遗漏。我认为目标中的数字越多,匹配就越低。
感谢。
答案 0 :(得分:1)
在评论和聊天中讨论后,
实现这一目标的步骤如下:
先决条件 - 如果您不想为模板匹配实施金字塔(如果由于过度杀伤而不需要),请确保模板与模板一样大主图像中的那个。
第1步:使用适当的相关度量运行cv2.matchTemplate
。
步骤2 :为测量设置合适的阈值以进行正确检测。
第3步:OP提到正方形有数字,因此来自here的数字识别,并将轮廓的像素设置为黑色,然后运行cv2.matchTemplate
也应该有效
PS。 OP在检测到方块后提到了数字识别,所以这种方式也解决了另一个问题。