我正在尝试识别这张图片上的 6 个方 block :
和检测哪些是选中的或黑色的(这里是 (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
时,我们看到两个 strong> 同一个正方形的轮廓在彼此之上
方法#2
是否可以使用原始图像与此“3x2 框模式”的所有“位移 + 旋转 + 重新缩放”版本之间的相关性:
这样可以进行良好的检测吗?
长话短说:
如何可靠地识别此类图像上的 6 个框并找到选中或黑色的框?
这是我的方法:
(1) Threshold and find the external contours
(2) Filter the contour by area and height/width, then distinguish by area occupy.
这是我的结果:
我是一名优秀的程序员,十分优秀!