Python 如何可靠地查找图像上的复选框(使用cv2.findContours或其他技术)?

Python 如何可靠地查找图像上的复选框(使用cv2.findContours或其他技术)?,python,opencv,image-processing,image-recognition,opencv-contour,Python,Opencv,Image Processing,Image Recognition,Opencv Contour,我试图识别这张图片上的6个方块: 和检测哪些是选中的或黑色的(这里是(1,1)和(3,2)) 周围可以有一些文本,也可以有一些图形,但没有任何内容与复选框非常相似 图像可以稍微旋转 方法#1 我试过: _, contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for j, c in enumerate(contours): cv2.drawContours(im

我试图识别这张图片上的6个方块:

检测哪些是选中的或黑色的(这里是(1,1)和(3,2))

  • 周围可以有一些文本,也可以有一些图形,但没有任何内容与复选框非常相似

  • 图像可以稍微旋转

方法#1 我试过:

_, contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for j, c in enumerate(contours):
    cv2.drawContours(imgcolor, [c], 0, COLORS[j % len(COLORS)], thickness=1)
但结果相当糟糕:

到目前为止,我所尝试的:

  • 使用
    cv2按区域过滤。轮廓区域(c)

  • 使用

      shape = cv2.approxPolyDP(c, 0.05 * cv2.arcLength(c, True), closed=True)
    
    如果len(shape)==4:则仅保留矩形,但这不起作用,因为一些正方形被分割为两个或三个轮廓:请参见右上角的正方形,它被识别为红色+青色轮廓

  • 注意:有些方块可以通过一个轮廓成功识别,但甚至可以通过两个轮廓识别,因此当我们
    绘制轮廓时,我们可以看到同一个方块的两个轮廓相互重叠

进近#2 是否可以使用原始图像和该“3x2盒模式”的所有“位置移动+旋转+重新缩放”版本之间的相关性

这样可以很好地检测吗

TL;博士: 如何可靠地识别这样一张图像上的6个框,并找到选中或黑色的框?

以下是我的方法:

(1) 阈值并找到外部轮廓

(2) 按面积和高度/宽度过滤轮廓,然后按面积进行区分

这是我的结果:


堆栈溢出的难题和一点开放性。一般来说,您希望减少测试中可能出现的位置/旋转次数,以便在合理的时间内得到答案。其他问题围绕着源图像的质量,它们都是机器生成的,还是来自相机/扫描仪,因为它们会为您带来更多需要处理的瑕疵是的@SamMason它确实来自扫描仪。找到外部轮廓是关键,您是对的(
cv2.findContours(img,cv2.RETR\u EXTERNAL,cv2.CHAIN\u APPROX\u SIMPLE)
)。重要的是在阈值化之后,在之前反转颜色,如屏幕截图中所示:
img=cv2.bit\u not(img)