Рисование ограничивающих рамок с помощью Pytesseract / OpenCV - PullRequest
3 голосов
/ 31 января 2020

Я использую pytesseract (0.3.2) с openCV (4.1.2) для идентификации цифр на изображениях. Пока image_to_string работает, image_to_data и image_to_boxes нет. Я должен быть в состоянии нарисовать ограничительные рамки на изображениях, и это поставило меня в тупик. Я пробовал разные изображения, старые версии pytesseract, et c. Я пользуюсь Windows и ноутбуками Jupyter.

import cv2 
import pytesseract

#erosion
def erode(image):
    kernel = np.ones((5,5),np.uint8)
    return cv2.erode(image, kernel, iterations = 1)

#grayscale
def get_grayscale(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#thresholding
def thresholding(image):
    #return cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
    return cv2.threshold(image, 200, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

img = cv2.imread('my_image.jpg')
pytesseract.pytesseract.tesseract_cmd = r'C:\mypath\tesseract.exe'

gray = get_grayscale(img)
thresh = thresholding(gray)
erode = remove_noise(thresh)

custom_config = r'-c tessedit_char_whitelist=0123456789 --psm 6'
print(pytesseract.image_to_string(erode, config=custom_config))

cv2.imwrite("test.jpg", erode)

#these return nothing
print(pytesseract.image_to_boxes(Image.open('test.jpg')))
print(pytesseract.image_to_data(Image.open('test.jpg')))

1 Ответ

2 голосов
/ 01 февраля 2020

Вместо использования image_to_boxes альтернативный подход состоит в том, чтобы просто найти контуры с помощью cv2.findContours, получить координаты ограничительного прямоугольника с помощью cv2.boundingRect и нарисовать ограничивающий прямоугольник с cv2.rectangle

Используя этот пример входного изображения

enter image description here

Рисованные прямоугольники

enter image description here

Результат от OCR

1234567890

Код

import cv2
import pytesseract
import numpy as np

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Draw bounding boxes
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)

# OCR
data = pytesseract.image_to_string(255 - thresh, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
...