#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 /