如何可靠地找到图像上的复选框(使用 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)
但效果很差:
到目前为止我尝试过的:
按地区过滤cv2.contourArea(c)
使用
shape = cv2.approxPolyDP(c, 0.05 * cv2.arcLength(c, True), closed=True)
并仅使用 if len(shape) == 4:
保留矩形,但这不会起作用,因为一些正方形被分成两个或三个轮廓:请参见右上角的正方形,它被识别为红色 + 青色轮廓
注意:一些正方形被一个轮廓成功识别,但即使两个轮廓,所以当我们drawContour
时,我们看到两个 等高线在同一个正方形的顶部
方法 #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.
这是我的结果:
我正在尝试识别这张图片上的 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.contourArea(c)
使用
shape = cv2.approxPolyDP(c, 0.05 * cv2.arcLength(c, True), closed=True)
并仅使用
if len(shape) == 4:
保留矩形,但这不会起作用,因为一些正方形被分成两个或三个轮廓:请参见右上角的正方形,它被识别为红色 + 青色轮廓注意:一些正方形被一个轮廓成功识别,但即使两个轮廓,所以当我们
drawContour
时,我们看到两个 等高线在同一个正方形的顶部
方法 #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.
这是我的结果: