Как определить все поля для ввода букв в формах для определенного поля? - PullRequest
0 голосов
/ 16 июня 2019

Требуется распознавать текст из форм с полями для каждого ввода символов.

Я попытался использовать ограничивающий прямоугольник для каждого ввода и обрезать этот конкретный вход, т.е. я могу получить все поля для ввода в поле «Имя». Но когда я пытаюсь обнаружить отдельные блоки в группе блоков, я не могу этого сделать, и opencv возвращает только один контур для всех блоков. Файл, указанный в цикле for, представляет собой файл, содержащий координаты ограничительной рамки. Cropped_img - это изображение, которое принадлежит входу одного поля (например, Name).

Изображение полной формы Full form image Это изображение формы.

cropped_img обрезанное изображение для каждого поля

Содержит много полей для ввода символов. Здесь количество обнаруженных контуров всегда равно единице. Почему я не могу обнаружить все отдельные ящики? Короче говоря, я хочу, чтобы все отдельные поля были указаны в cropped_img.

Кроме того, любая другая идея для решения задачи формы ocr действительно ценится!

for line in file.read().split("\n"):
        if len(line)==0:
            continue 
        region = list(map(int,line.split(' ')[:-1]))      
        index=line.split(' ')[-1] 
        text=''
        contentDict={}
        #uzn in format left, up, width, height
        region[2] = region[0]+region[2]
        region[3] = region[1]+region[3]
        region = tuple(region)
        cropped_img =  panimg[region[1]:region[3],region[0]:region[2]]

        index=index.replace('_', ' ')
        if index=='sign' or index=='picture' or index=='Dec sign':
            continue

        kernel = np.ones((50,50),np.uint8)
        gray = cv2.cvtColor(cropped_img, cv2.COLOR_BGR2GRAY)
        ret, threshold = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
        threshold = cv2.bitwise_not(threshold)   
        dilate = cv2.dilate(threshold,kernel,iterations = 1)
        ret, threshold = cv2.threshold(dilate,127,255,cv2.THRESH_BINARY)
        dilate = cv2.dilate(threshold,kernel,iterations = 1)
        contours, hierarchy = cv2.findContours(dilate,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        contours.sort(key=lambda x:get_contour_precedence(x, panimg.shape[1]))


        print("Length of contours detected: ", len(contours))
        for j, ctr in enumerate(contours):
            # Get bounding box
            x, y, w, h = cv2.boundingRect(ctr)

            # Getting ROI

            roi = cropped_img[y:y+h, x:x+w]
            # show ROI
            cv2.imshow('segment no:'+str(j-1),roi)
            cv2.waitKey(0)

Содержимое файла 'file' выглядит следующим образом:

462 545 468 39 AO_Office
450 785 775 39 Last_Name
452 836 770 37 First_Name
451 885 772 39 Middle_Name
241 963 973 87 Abbreviation_Name

Ожидаемый результат - это контуры для отдельных полей для ввода одной буквы для каждого поля

...