python opencv如何检测ROI和周围数字

python opencv如何检测ROI和周围数字,python,opencv,Python,Opencv,我在这里有一个图像: 我想找到问题编号,即: 所以,一般来说,对于普通形状,我可以使用形状检测或模板匹配来检测这个家伙: 然而,在该区域内有一个数字 有人知道这种情况吗 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_rg

我在这里有一个图像:

我想找到问题编号,即:

所以,一般来说,对于普通形状,我可以使用形状检测或模板匹配来检测这个家伙:

然而,在该区域内有一个数字

有人知道这种情况吗

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的目标没有实现。我认为目标中的数字越多,匹配度越低


谢谢。

在评论和聊天中讨论之后

实现这一目标的步骤如下:

先决条件-如果您不想为模板匹配实现金字塔(如果由于过度使用而不需要),请确保模板与主图像中的模板一样大

步骤1:使用适当的相关性度量运行
cv2.matchTemplate

步骤2:为测量设置适当的阈值,以便正确检测

步骤3:OP提到了具有数字的正方形,因此可以从中进行数字识别,并将轮廓的像素设置为黑色,然后运行
cv2。matchTemplate
也可以工作


另外,OP提到在检测到方块后进行数字识别,所以这种方法也解决了另一个问题

你试过模板匹配吗?我认为即使形状中有一个数字,相关性仍然很高。您好,请参见上面我的编辑1,相关性很差且不准确。嗯,现在编辑会更好。如果您知道所有图像的目标始终位于图像的左侧15%,我建议您对其进行裁剪,并对图像/模板的至少10个棱锥体运行模板匹配,然后进行检查。这是一个肮脏的方法,但可能是它的工作。我看到你的链接后,但似乎不是我想要的。这更像是比例尺比赛。实际上,我的情况是模板尺寸和原始图像中的目标尺寸几乎相同。但是这个链接很有用,因为我们以后可能会遇到这个问题:-)