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

How to reliably find checked boxes on an image (with cv2.findContours or another technique)?

我正在尝试识别这张图片上的 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)

但效果很差:

到目前为止我尝试过的:

方法 #2

是否可以在原始图像和此“3x2 框模式”的所有“位移+旋转+重新缩放”版本之间使用相关性

这样可以很好地检测吗?

TL;DR:

如何可靠地识别此类图像上的 6 个框并找到选中或黑色的框?

这是我的方法:

(1) Threshold and find the external contours

(2) Filter the contour by area and height/width, then distinguish by area occupy.

这是我的结果: