【发布时间】:2020-11-04 12:49:58
【问题描述】:
我的作品:
- 扫描纸张
- 检查水平和垂直线
- 检测复选框
- 如何知道复选框是否被勾选
此时,我想我可以通过使用 Hierarchical 和 Contours 找到它:下面是我的工作
for i in range (len( contours_region)): #I already have X,Y,W,H of the checkbox through
#print(i) #cv2.connectedComponentsWithStats
x = contours_region[i][0][1] #when detecting checkbox
x_1 = contours_region[i][2][1]
y = contours_region[i][0][0]
y_1 = contours_region[i][2][0]
image_copy= image.copy()
X,Y,W,H = contours_info[i]
cv2.drawContours(image_copy, [numpy.array([[[X,Y]],[[X+W,Y]],[[X+W,Y+H]],[[X,Y+H]]])], 0, (0,0,255),2)
gray = cv2.cvtColor(image_copy, cv2.COLOR_BGR2GRAY)
ret,bw = cv2.threshold(gray,220,255,cv2.THRESH_BINARY_INV)
contours,hierarchy = cv2.findContours(bw[x:x_1, y:y_1], cv2.RETR_CCOMP,1)
print('-----Hierarchy-----')
print(hierarchy)
print('-----Number of Contours : '+ str(len(contours)))
cv2.imshow('a', image_copy)
cv2.waitKey(0)
我得到了这个结果(一些高轮廓,一些高层次)
-----Hierarchy----- [[[-1 -1 1 -1] [ 2 -1 -1 0] [ 3 1 -1 0] [ 4 2 -1 0] [ 5 3 -1 0] [ 6 4 -1 0] [ 7 5 -1 0] [-1 6 -1 0]]] -----Number of Contours : 8
另一个结果:
低轮廓,低层次
-----Hierarchy----- [[[-1 -1 1 -1] [ 2 -1 -1 0] [-1 1 -1 0]]] -----Number of Contours : 3
但是,在某些情况下它没有被勾选但仍然得到非常高的结果,这并不完美
[[[-1 -1 1 -1] [ 2 -1 -1 0] [ 3 1 -1 0] [ 4 2 -1 0] [ 5 3 -1 0] [-1 4 -1 0]]] -----Number of Contours : 6
总的来说,在查看整个数据后,勾选和未勾选之间的差距并不令人信服。大约 30% 的盒子,给出了错误的结果。所以,真心希望有更好的方法。
【问题讨论】:
-
选中和未选中的框之间应该有非白色像素数差异。我的建议是,只需比较这些像素数并决定
标签: python opencv image-processing cv2