Rozpoznawanie spadających liter i cyfr.

1

Witam was. Zanim zdecydowałem się napisać ten post przeszukałem internet w poszukiwaniu skryptu który będzie potrafił rozpoznawać losowo spadające litery i cyfry i symulować wciskanie ich na klawiaturze coś jak w tej grze dla dzieci sprzed lat kojarzycie? Niestety nie udało mi się nic takiego znaleźć. Pomożecie?

0

Cześć @Ozi APK (Ozi)! Fajnie że napisałeś! 👋

Ozi APK (Ozi) napisał(a):

Witam was. Zanim zdecydowałem się napisać ten post przeszukałem internet w poszukiwaniu skryptu który będzie potrafił rozpoznawać losowo spadające litery i cyfry i symulować wciskanie ich na klawiaturze coś jak w tej grze dla dzieci sprzed lat kojarzycie? Niestety nie udało mi się nic takiego znaleźć. Pomożecie?

Symulowanie wciskanych klawiszy wydaje się dosyć proste do zrobienia, wystarczy poszukać "python keyboard events".

Jeśli litery spadają i się ruszają, to dobrze byłoby wyłapać poszczególną literę, możesz do tego użyć np. motion tracking z OpenCv, żeby znaleźć miejsce w którym litery spadają, i wyczaić z nich poszczególne miejsce gdzie jest litera. Używając OpenCV można łatwo wykryć kiedy litera np. przekracza dolną krawędź ekranu. OpenCV nie ma nic wspólnego z CV z ofertami pracy, zbieżność skrótów.

Jak już masz obraz poszczególnej litery, to wystarczy teraz ją jakoś przeparsować i zgadnąć co to dokładnie za litera jest w tym obrazie, pewnie będzie to zależeć od użytego fontu. Wpisałbym w google "python read text from image".

Finalnie należałoby to złożyć w całość:

  1. Użyj motion tracking, żeby znaleźć miejsce poszczególnych liter.
  2. Użyj "text from image", żeby rozpoznać poszczególne litery.
  3. Wyślij zdarzenie klawiatury żeby zasymulować wciskanie klawisza.
1

Mam coś takiego lecz nie potrafię nic z tym zrobić dalej nie mam też pojęcia od czego zacząć. Troszkę zielony jestem

import pygame
import random
import pyautogui

# Inicjalizacja Pygame
pygame.init()

# Ustawienia ekranu
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Spadające Litery i Cyfry")

# Kolory
white = (255, 255, 255)
black = (0, 0, 0)

# Lista liter i cyfr
characters = [chr(i) for i in range(65, 91)] + [str(i) for i in range(10)]

# Główna pętla gry
running = True
while running:
    screen.fill(black)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Losowanie litery/cyfry
    char = random.choice(characters)
    font = pygame.font.Font(None, 74)
    text = font.render(char, True, white)
    x = random.randint(0, screen_width - text.get_width())
    screen.blit(text, (x, 0))

    # Symulacja spadania
    for y in range(0, screen_height, 5):
        screen.fill(black)
        screen.blit(text, (x, y))
        pygame.display.flip()
        pygame.time.delay(50)

        # Symulacja wpisywania
        pyautogui.typewrite(char)
    
    pygame.display.flip()

pygame.quit()
0
Ozi APK (Ozi) napisał(a):

Mam coś takiego lecz nie potrafię nic z tym zrobić dalej nie mam też pojęcia od czego zacząć. Troszkę zielony jestem

Próbujesz zrobić grę w której gracz na klikać w litery jak spadają? Czy chcesz zrobić ekran taki w którym litery spadają, i wtedy kiedy spadają to ma to klikać?

Główny problem jest taki, że losujesz literę oraz jej pozycję w pętli rysowania. Tzn. że jak np. spadająca litera zajmie 1000 klatek, to w każdej z tych klatek pozycja litery i sama litera będzie inna. Powinieneś ją wylosować literę oraz pozycję, zapisać w zmiennej poza pętlą, i potem się do niej odnieść.

Po drugie, wysokość litery też nie jest w sensowny sposób kontrolowana, powinieneś również zapisać pozycję y litery, a następnie w pętli ją zwiększać.

Po trzecie - gra się zacina, ponieważ nie przyjmujesz eventów UI (cały wątek jest zajęty przez operacje graficzne). Powinieneś wykonać pygame.display.update(), żeby wywołać eventy żeby gra nie sprawiała wrażenia "zaciętej".

No i po czwarte, nigdzie nie losujesz nowej litery i nowej pozycji.

Mogłoby to wyglądać jakoś tak:

import random
import pygame

def game_finished() -> bool:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            return True
    return False

screen_width = 800
screen_height = 600
white = (255, 255, 255)
black = (0, 0, 0)

available_characters = [chr(i) for i in range(65, 91)] + [str(i) for i in range(10)]

pygame.init()
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Spadające Litery i Cyfry")
font = pygame.font.Font(None, 74)

selected_char = None
selected_x = None
selected_y = None

while True:
    if game_finished():
        break

    text = font.render(selected_char, True, white)
    if selected_char is None:
        selected_char = random.choice(available_characters)
        selected_x = random.randint(0, screen_width - text.get_width())
        selected_y = 0

    if selected_y > screen_height:
        selected_char = None
        # pyautogui.typewrite(char)
    else:
        selected_y += 1

    screen.fill(black)
    screen.blit(text, (selected_x, selected_y))
    pygame.time.delay(5)
    pygame.display.flip()
    pygame.display.update()

pygame.quit()
0

Nie chce stworzyć gry lecz skrypt który będzie je rozpoznawać w aplikacji zewnętrznej i je wciskał.

0
Ozi APK (Ozi) napisał(a):

Nie chce stworzyć gry lecz skrypt który będzie je rozpoznawać w aplikacji zewnętrznej i je wciskał.

No to opis jak to zrobić dałem w poście wyżej: Rozpoznawanie spadających liter i cyfr.

0

Czyli teraz to wklejam w visual studio i powinno ruszyć?

0
Ozi APK (Ozi) napisał(a):

Czyli teraz to wklejam w visual studio i powinno ruszyć?

Jak rozumiem, kod który wkleiłeś rysuje litery na ekranie w pygame, oraz też ma autogui ktory wciska litery.

Mówiesz też że oprócz tego chcesz drugi program, który ma rozpoznawać litery na ekranie - i tego jeszcze nie napisałeś, jak rozumiem?

0

Mam tylko ten kod co podałem wyżej nic więcej.
Najłatwiej jakbym ci to wyjaśnił dokładniej np współdzieleniem ekranu np na discordzie jeżeli jest taka opcja.
Może przy okazji bym się czegoś nauczył.

0
Ozi APK (Ozi) napisał(a):

Mam tylko ten kod co podałem wyżej nic więcej.
Najłatwiej jakbym ci to wyjaśnił dokładniej np współdzieleniem ekranu np na discordzie jeżeli jest taka opcja.
Może przy okazji bym się czegoś nauczył.

No to jeśli chcesz stworzyć rozpoznawanie liter i wciskanie, to chyba musisz napisać swój program od nowa, np korzystając z OpenCV.

0

Taki np?

import cv2
import numpy as np
import pytesseract
import pyautogui
import time


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

def capture_screen():
    # Przechwytywanie ekranu
    screen = pyautogui.screenshot()
    screen_np = np.array(screen)
    screen_rgb = cv2.cvtColor(screen_np, cv2.COLOR_BGR2RGB)
    return screen_rgb

def recognize_text(image):
    # Rozpoznawanie tekstu
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
    text = pytesseract.image_to_string(thresh)
    return text.strip()

def simulate_keypress(text):
    # Symulacja wciskania klawiszy
    for char in text:
        if char.isalnum():  # Sprawdzenie, czy to litera lub cyfra
            pyautogui.press(char)

def main():
    print("Program rozpoczęty. Rozpoznawanie tekstu z ekranu i symulacja wciskania klawiszy...")
    time.sleep(2)  # Czas na przygotowanie ekranu

    while True:
        screen_image = capture_screen()
        recognized_text = recognize_text(screen_image)

        if recognized_text:
            print(f"Rozpoznany tekst: {recognized_text}")
            simulate_keypress(recognized_text)

        time.sleep(1)  # Opóźnienie między przechwyceniem ekranu

if __name__ == "__main__":
    main()

1
Ozi APK (Ozi) napisał(a):

Taki np?

No jeśli Ci to działa i spełnia Twoje założenia, to chyba jest okej?

2

OCR to ostateczność.
Optymalnym rozwiązaniem byłoby gdyby skrypt czytał znaki z pamięci działającej aplikacji, a nie z obrazu.

0

W jaki sposób to przerobić żeby czytał te znaki z aplikacji a nie obrazu

0

Zapytaj się Chata GPT: "Jak mógłbym się nauczyć hookować grę?"

https://chatgpt.com/share/3e5fbc63-10d0-4406-975a-b4b88e1ff71d

0

Jak zauważyłeś nie jest się ciężko domyślić że próbuję zrobić bota który będzie klikał za mnie te literki aczkolwiek staram się zrobić to samemu i proszę was tylko o pomoc czy te kody które przedstawiam powyżej się do czegokolwiek nadają ponieważ jesteście mądrzejsi ode mnie w tej dziedzinie dlatego sięgam waszej rady

1
Ozi APK (Ozi) napisał(a):

Jak zauważyłeś nie jest się ciężko domyślić że próbuję zrobić bota który będzie klikał za mnie te literki aczkolwiek staram się zrobić to samemu i proszę was tylko o pomoc czy te kody które przedstawiam powyżej się do czegokolwiek nadają ponieważ jesteście mądrzejsi ode mnie w tej dziedzinie dlatego sięgam waszej rady

Kod który wkleiłeś w tym poście: Rozpoznawanie spadających liter i cyfr. to jest dobry punkt wyjścia.

1

Nie rozumiem o co chodzi z tym „litera spadająca w kwadracie” ale funkcja image_to_string zwróci Ci całego stringa z obrazu a nie pojedynczy element tego stringa. Musiałbyś zmienić na funkcje image_to_data, która zwraca dodatkowo współrzędne i na podstawie tego dopisać kawałek kodu, który określi warunki i znajdzie ten znak który „spada”

0
mitowski napisał(a):

Nie rozumiem o co chodzi z tym „litera spadająca w kwadracie” ale funkcja image_to_string zwróci Ci całego stringa z obrazu a nie pojedynczy element tego stringa. Musiałbyś zmienić na funkcje image_to_data, która zwraca dodatkowo współrzędne i na podstawie tego dopisać kawałek kodu, który określi warunki i znajdzie ten znak który „spada”

No tak, i właśnie dlatego mu zaproponowałem openCv i motion tracking.

1

@Riddle: Niekoniecznie motion tracking.

Jeśli określisz obszar skanowania, to złapiesz dowolną literkę, która spada z góry na dół i nie złapiesz elementów GUI itp.

screenshot-20240904193613.png

1
Spine napisał(a):

Jeśli określisz obszar skanowania, to złapiesz dowolną literkę, która spada z góry na dół i nie złapiesz elementów GUI itp.

Fakt, jeśli nie ma w tym miejscu innych liter, to to wystarczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1