@ocavgust666

Как отфильтровать текст Python?

import pyautogui
import pytesseract
from PIL import Image
import cv2
import re
import keyboard
import time

# Путь к Tesseract OCR
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# (русский)
tesseract_config = '--psm 6 -l rus'

# Путь для сохранения скриншотов
screenshot_path = "screenshot.png"

# Слова, их сокращения и соответствующие изображения
words_and_images = {
    ("Салат1", "Салат1"): r"C:\Users\123\PycharmProjects\burger dorabotka\words\salat1.png",
    ("Салат2", "Салат2"): r"C:\Users\123\PycharmProjects\burger dorabotka\words\salat2.png",
}

def recognize_text(region):
    # Захват области экрана и сохранение в изображение
    region_image = pyautogui.screenshot(region=region)
    region_image.save(screenshot_path)

    # Распознавание текста в указанной области
    text = pytesseract.image_to_string(region_image, config=tesseract_config)
    return text.strip()

def clean_word(match):
    cleaned_word_match = re.match(r'\D+', match.group(1))
    return cleaned_word_match.group().strip() if cleaned_word_match else ''

def find_and_click_words(words_and_images, initial_search_region, new_search_region):
    found_words = []

    # Захват изображения и распознавание текста в initial_search_region
    screenshot = pyautogui.screenshot(region=initial_search_region)
    screenshot.save(screenshot_path)

    # Поиск слов и их номеров
    matches = re.finditer(r'\d*\.\s*([\w\s]+)', recognize_text(initial_search_region))
    for match in matches:
        found_words.append({
            'Слово': clean_word(match),
        })

    # Выводим на экран найденные слова на initial_search_region
    print(f"\nНайденные слова на initial_search_region: {found_words}")

    # Производим поиск и клик в new_search_region
    for word in found_words:
        # Проверяем, есть ли слово в списке слов и сокращений
        for full_word, abbreviation in words_and_images.keys():
            if word['Слово'] == full_word or word['Слово'] == abbreviation:
                image_path = words_and_images[(full_word, abbreviation)]

                while True:
                    # Поиск изображения в new_search_region
                    template = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
                    new_screenshot = pyautogui.screenshot(region=new_search_region)
                    new_screenshot.save(screenshot_path)
                    new_image = cv2.imread(screenshot_path, cv2.IMREAD_GRAYSCALE)
                    result = cv2.matchTemplate(new_image, template, cv2.TM_CCOEFF_NORMED)
                    _, max_val, _, max_loc = cv2.minMaxLoc(result)

                    if max_val > 0.9:  # Задайте порог по необходимости
                        # Коррекция координат для клика в new_search_region
                        click_x = new_search_region[0] + max_loc[0] + template.shape[1] // 2
                        click_y = new_search_region[1] + max_loc[1] + template.shape[0] // 2

                        # Добавляем паузу перед кликом в new_search_region
                        time.sleep(1)

                        pyautogui.click(click_x, click_y)
                        print(f"Слово {word['Слово']} найдено и выполнен клик в new_search_region.")
                        break  # Exit the loop once the image is found
                    else:
                        print(f"Изображение для слова {word['Слово']} не найдено. Повторный поиск.")

# Начальные координаты для поиска текста (левая верхняя x, левая верхняя y, ширина, высота)
initial_search_region = (1322, 388, 169, 281)

# Новые координаты для поиска текста (левая верхняя x, левая верхняя y, ширина, высота)
new_search_region = (270, 322, 400, 477)

print("Для запуска программы нажмите клавишу F5.")

while True:
    # Ожидание клавиши F5 для запуска программы
    if keyboard.is_pressed('F5'):
        print("Программа запущена. Для завершения нажмите клавишу F4.")
        program_running = True

        while program_running:
            find_and_click_words(words_and_images, initial_search_region, new_search_region)
            pyautogui.click(1109, 877)  # Выполнение клика по координатам (1109, 877)

            # Ожидание клавиши F4 для завершения программы
            if keyboard.is_pressed('F4'):
                print("Программа завершена.")
                program_running = False

            time.sleep(2)  # Добавлена задержка в 1 секунду перед повтором


Объясню суть программы,для начала она на initial_search_region распознает написанный текст отфильтровывает его по числовому порядку https://imgur.com/HesygqY т.е Хлеб,Масло,Салат,Салат,Хлеб.Производит поиск картинки исходя из названия: Хлеб-поиск изображения хлеба,Масло- изображения масла и тд.В чем заключается мой вопрос?Как отфильтровать текст в initial_search_region чтобы удалились числа с точкой, т.е 1. 2. 3. но при этом чтобы разновидность Салатов например Салат 1,Cалат 2, оставались нетронуты и являлись целым словом? Получиться должно Хлеб,Масло,Салат 1,Салат 2,Хлеб.
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Регулярные выражения в Питоне
import re

pattern = re.compile(r'^\d+\.\s+')  # начало строки, 1+ цифра, точка, 1+ пробел
# re.compile() можно сделать один раз, а потом переиспользовать полученный pattern
text = '1. Салат 1'
result = pattern.sub('', text)  # заменяем пустой строкой подходящие под шаблон части text
print(result)
Ответ написан
@U235U235
Что мешает предварительно кропнуть картинку, так, чтобы числа с точками не попали в облать распознавания? Создаем сами себе трудности, а потом героически их преодолеваем. :-)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы