Повышение надежности чтения текста в Pytesseract - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь прочитать относительно четкие цифры на скриншоте, но у меня возникают проблемы с получением правильного чтения текста. У меня есть следующий скриншот:

This is the resulting image for scoreboard

И я знаю, что счет (2-0) и часы (1:42) будут в точно такое же место.

Это код, который у меня сейчас есть для чтения времени и оранжевого счёта:

lower_orange = np.array([0, 90, 200], dtype = "uint8")
upper_orange = np.array([70, 160, 255], dtype = "uint8")

    #Isolate scoreboard location on a 1080p pic
    clock = input[70:120, 920:1000]
    scoreboard = input[70:150, 800:1120]

    #greyscale
    roi_gray = cv2.cvtColor(clock, cv2.COLOR_BGR2GRAY)

    config = ("-l eng -c tessedit_char_whitelist=0123456789: --oem 1 --psm 8")
    time = pytesseract.image_to_string(roi_gray, config=config)
    print("time is " + time)

    # find the colors within the specified boundaries and apply
    # the mask
    mask_orange = cv2.inRange(scoreboard, lower_orange, upper_orange)

    # find contours in the thresholded image, then initialize the
    # list of digit locations
    cnts = cv2.findContours(mask_orange.copy(), cv2.RETR_EXTERNAL,
                            cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    locs = []

    for (i, c) in enumerate(cnts):
        # compute the bounding box of the contour, then use the
        # bounding box coordinates to derive the aspect ratio
        (x, y, w, h) = cv2.boundingRect(c)
        ar = w / float(h)

        # since score will be a fixed size of about 25 x 35, we'll set the area at about 300 to be safe
        if w*h > 300:
            orange_score_img = mask_orange[y-5:y+h+5, x-5:x+w+5]
            orange_score_img = cv2.GaussianBlur(orange_score_img, (5, 5), 0)

            config = ("-l eng -c tessedit_char_whitelist=012345 --oem 1 --psm 10")
            orange_score = pytesseract.image_to_string(orange_score_img, config=config)
            print("orange_score is " + orange_score)

вот вывод:

time is 1:42
orange_score is

Вот orange_score_img, после того как я замаскировал все в пределах моей верхней и нижней оранжевых границ и применил размытие по Гауссу.

enter image description here

Еще на этом этапе даже когда я настраиваю pytesseract для поиска 1 символа и ограничиваю белый список, я все равно не могу заставить его правильно читать. Есть ли какая-то дополнительная постобработка, которую я пропускаю, чтобы помочь pytesseract прочитать это число как 2?

1 Ответ

0 голосов
/ 20 марта 2020

По предложению @fmw42 я попытался поиграть с некоторыми изменениями морфологии. Сгущение чисел, похоже, помогло!

kernel = np.ones((5,5),np.uint8) orange_score_img = cv2.dilate(orange_score_img,kernel,iterations=1)

РЕДАКТИРОВАТЬ: РЕАЛЬНЫЙ ответ, я понял, заключается в том, что pytesseract намного лучше с черным текстом на белом фоне, чем белый текст на черный фон! он отлично читается, когда я переворачиваю цвета:

orange_score_img = cv2.bitwise_not(orange_score_img)

Надеюсь, это поможет людям, когда они впервые начнут использовать pytesseract! Попытка настроить изображение под все мои случаи было невероятно разочаровывающим, и зная, что черный текст на белом работает намного лучше, я бы сэкономил часы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...