【问题标题】:Best way to detect if checkbox is ticked检测复选框是否被勾选的最佳方法
【发布时间】:2020-11-04 12:49:58
【问题描述】:

我的作品:

  1. 扫描纸张
  2. 检查水平和垂直线
  3. 检测复选框
  4. 如何知道复选框是否被勾选

此时,我想我可以通过使用 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


【解决方案1】:

我认为侵蚀功能可以帮助您。使用侵蚀使刻度更大,然后计算非零像素。 在这里您可以找到基础知识:

import cv2 
import numpy as np
from google.colab.patches import cv2_imshow
img = cv2.imread("image.png");
cv2_imshow(img)
kernel = np.ones((3, 3), np.uint8) 

better_image = cv2.erode(img,kernel)
cv2_imshow(better_image)

【讨论】:

  • 谢谢,非常有用。此外,这似乎只有在我们很好地检测到方盒的情况下才能正常工作。而且,你为什么不用cv2.imshow ??
  • 我在 google colab 中检查了代码。那里你不能使用 cv2.imshow()。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 2023-04-04
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多