Операторы IF со строками из PyTesseract

#python #if-statement #ocr #tesseract #python-tesseract

#python #if-оператор #ocr #тессеракт #python-тессеракт

Вопрос:

Я полный новичок во всем этом (включая Python), но мне это нужно для проблемы, над которой я работаю. Я аннотировал свой код, так что, надеюсь, будет легко увидеть, что я сделал. Я пытаюсь прочитать раздел моего экрана в режиме реального времени, при этом любой текст, обнаруженный OCR, сравнивается со всеми операторами if / else . Когда он совпадает, я хочу, чтобы он печатал строку. В настоящее время обнаружение распознавания в реальном времени работает, но оно не проходит через операторы if / else для печати правильных строк. Я знаю это, поскольку print(tesstr) выдает правильные выходные данные, но текущий код не выдает никаких выходных данных.

 # cv2.cvtColor takes a numpy ndarray as an argument
import numpy as nm

import pytesseract

# importing OpenCV
import cv2

from PIL import ImageGrab


def imToString():

    while(True):

        # ImageGrab-To capture the screen image in a loop.
        # Bbox used to capture a specific area.
        cap = ImageGrab.grab(bbox=(267, 225, 344, 257))

        # Inverted the image for it to be easily
        # read by the OCR and obtained the output String.
        tesstr = pytesseract.image_to_string(
            cv2.bitwise_not(nm.array(cap)),
            lang='eng',
            config = '--psm 7')
        if (tesstr == '1'):
            print('Ace')
        elif (tesstr == '2'):
            print('Queen')
        elif (tesstr == '3'):
            print('King')
        ...
# Calling the function
imToString()
  

Комментарии:

1. Вы можете распечатать выходные данные перед операторами if и проверить, действительно ли это та же строка, которую вы ожидаете. Он может читать «1» как «1» с пробелом

2. Попробуйте напечатать len(tesstr), возможно, ваша строка содержит пробелы, и поэтому ваше сравнение завершается неудачно

3. Спасибо, теперь это работает!

Ответ №1:

Благодаря комментариям я наконец-то это сделал.

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

 # cv2.cvtColor takes a numpy ndarray as an argument
import numpy as nm

# importing Tesseract for the OCR
import pytesseract

# importing OpenCV
import cv2

# importing ImageGrab to take the image of my screen
from PIL import ImageGrab

# importing re to santise my output to something readable by the if statement
import re

def replace_chars(text):

    # Replaces all characters instead of numbers from 'text'.
    # :param text: Text string to be filtered
    # :return: Resulting number
    
    list_of_numbers = re.findall(r'd ', text)
    result_number = ''.join(list_of_numbers)
    return result_number


def imToString():

    while(True):

        # ImageGrab-To capture the screen image in a loop.
        # Bbox used to capture a specific area.
        cap = ImageGrab.grab(bbox=(267, 225, 344, 257))

        # Reading from terminal window, so
        # inverted the image for it to be easily
        # read by the OCR engine.
        # --psm 7 as it reads input as single line.

        tesstr = pytesseract.image_to_string(
            cv2.bitwise_not(nm.array(cap)),
            lang='eng',
            config = '--psm 7')

        # Calling replace_chars to only read numbers
        tesstr = replace_chars(tesstr)
        print(tesstr)

        if (tesstr == '1'):
            print('Ace')
        elif (tesstr == '2'):
            print('Queen')
        elif (tesstr == '3'):
            print('King')        
        ...

# Calling the function
imToString()
  

replace_chars, украденные из https://return2.net/python-tesseract-4-0-get-numbers-only /