Требуется распознавать текст из форм с полями для каждого ввода символов.
Я попытался использовать ограничивающий прямоугольник для каждого ввода и обрезать этот конкретный вход, т.е. я могу получить все поля для ввода в поле «Имя». Но когда я пытаюсь обнаружить отдельные блоки в группе блоков, я не могу этого сделать, и opencv возвращает только один контур для всех блоков. Файл, указанный в цикле for, представляет собой файл, содержащий координаты ограничительной рамки. Cropped_img - это изображение, которое принадлежит входу одного поля (например, Name).
Изображение полной формы
Это изображение формы.
обрезанное изображение для каждого поля
Содержит много полей для ввода символов. Здесь количество обнаруженных контуров всегда равно единице. Почему я не могу обнаружить все отдельные ящики?
Короче говоря, я хочу, чтобы все отдельные поля были указаны в 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
Ожидаемый результат - это контуры для отдельных полей для ввода одной буквы для каждого поля