Domanda è possibile creare una funzione che ti permette in tempo reale di confrontare due immagini?

imvalez

Utente Silver
7 Aprile 2014
68
5
10
68

è possibile creare una funzione che ti permette in tempo reale di confrontare due immagini?​

ovvero mentre la registrazione in background dello schermo è attiva,​

se viene visualizzata un immagine specifica sullo schermo in tempo reale,​

ad esempio un’icona,​

in automatico il programma esegue la funzione di tenere premuto il mouse sinistro,​

successivamente se l’icona diventa rossa il tasto sinistro viene rilasciato​

e quando l’icona torna verde il tasto sinistro torna a essere premuto...​


Grazie in anticipo boyz

sto iniziando da poco a programmare e sto cercando di creare questa funzione automatica in un gioco
 
In python potresti farlo in questo modo con pyautogui e Pillow (usata anche da pyautogui stesso) :
  1. Ottieni uno screenshot della finestra che ti interessa
  2. Leggi i pixel alle coordinate X e Y dove devi osservare il cambio del colore; usa il formato RGB ogni pixel è composto da 3 numeri: Red, Green e Blue
  3. Più il pixel ha R elevato rispetto a G e B più sarà rosso acceso (per gestire varie sfumature se non sai il colore esatto a priori)
  4. Se il colore del pixel rientra nei parametri richiesti ed è diverso dal colore precedente usa pyautogui per fare i click necessari
  5. Annota in una variabile esterna al ciclo l'ultimo colore rilevato in modo da non ripetere l'azione appena eseguita quando il colore non cambia
  6. Aspetta N secondi con time.sleep(N) (per non sovraccaricare la CPU, puoi usare anche valori bassi come 0.1 cioè 100 millisecondi)
  7. Ripeti dal punto 1 con un ciclo
 
  • Mi piace
Reazioni: imvalez
In python potresti farlo in questo modo con pyautogui e Pillow (usata anche da pyautogui stesso) :
  1. Ottieni uno screenshot della finestra che ti interessa
  2. Leggi i pixel alle coordinate X e Y dove devi osservare il cambio del colore; usa il formato RGB ogni pixel è composto da 3 numeri: Red, Green e Blue
  3. Più il pixel ha R elevato rispetto a G e B più sarà rosso acceso (per gestire varie sfumature se non sai il colore esatto a priori)
  4. Se il colore del pixel rientra nei parametri richiesti ed è diverso dal colore precedente usa pyautogui per fare i click necessari
  5. Annota in una variabile esterna al ciclo l'ultimo colore rilevato in modo da non ripetere l'azione appena eseguita quando il colore non cambia
  6. Aspetta N secondi con time.sleep(N) (per non sovraccaricare la CPU, puoi usare anche valori bassi come 0.1 cioè 100 millisecondi)
  7. Ripeti dal punto 1 con un ciclo
mi hai detto molto e non mi hai detto niente, perché l’icona cambia posizione costantemente.. non ha un posto fisso, mi servirebbe che il programma capisca che dove è l’icona e la segua anche se si sposta…
poi bisogna tenere premuto il mouse sinistro in base al colore, quando è verde si tiene premuto e quando diventa rosso non bisogna premere e poi tenere premuto quando torna verde… un loop così che segua l’icona che si sposta
 
Ultima modifica:
Ciao! In python, usando pyautogui, potresti fare qualcosa del genere:

Python:
import pyautogui
import time

colore = (255, 0, 0) #Cerca i valori RGB e settali nel programma
schermo = pyautogui.screenshot()

while (True):
    for i in range(schermo.width): #Cerco la tonalità di colore impostata nello schermo
        for j in range(schermo.height):
            if (schermo.getpixel((i, j)) == colore):
                pyautogui.click(i, j, interval=2) #Clicco sul pixel che ha la tonalità di colore cercata e imposto il tempo del click, in secondi, attraverso l'argomento "interval"
                time.sleep(5) #Aspetto 5 secondi
 
  • Mi piace
Reazioni: imvalez
Ciao! In python, usando pyautogui, potresti fare qualcosa del genere:

Python:
import pyautogui
import time

colore = (255, 0, 0) #Cerca i valori RGB e settali nel programma
schermo = pyautogui.screenshot()

while (True):
    for i in range(schermo.width): #Cerco la tonalità di colore impostata nello schermo
        for j in range(schermo.height):
            if (schermo.getpixel((i, j)) == colore):
                pyautogui.click(i, j, interval=2) #Clicco sul pixel che ha la tonalità di colore cercata e imposto il tempo del click, in secondi, attraverso l'argomento "interval"
                time.sleep(5) #Aspetto 5 secondi
non riesco a farlo funzionare........
 
IMG_0356.jpeg

Messaggio unito automaticamente:

ho cercato di scriverlo il pi\ comprensibile possibile, sto cercando di fare questo script con pyton da utilizzare nella pesca su un gioco, se siete in grado di risolvere questo enigma vi stimo, sono 3 giorni che ci provo con scarsi risultati...
 

Allegati

  • attenction.png
    attenction.png
    3.8 KB · Visualizzazioni: 3
  • g aft rgba(0,230,163,255).png
    g aft rgba(0,230,163,255).png
    4 KB · Visualizzazioni: 3
  • green pre.png
    green pre.png
    5.9 KB · Visualizzazioni: 3
  • r aft rgba(201,100,26,255).png
    r aft rgba(201,100,26,255).png
    5.4 KB · Visualizzazioni: 3
Se preferisci cercare un immagine al posto dei singoli colori ti conviene fare leggere i file separati che hai caricato qui a python, poi se non vuoi scrivere l'algoritmo tu potresti importare autopy, secondo la loro documentazione la funzione find_bitmap ritorna le coordinate dello schermo dove l'immagine è stata trovata. Esempio:

Python:
import autopy
import pyautogui

img_to_click = autopy.bitmap.Bitmap.open('to_click.png')
last_found = None
clicking = False

while True:
    screenshot = autopy.bitmap.capture_screen()
    found = screenshot.find_bitmap(img_to_click, 0.1f)
    # Only if situation has changed since 50ms ago
    if found != last_found :
        if clicking:
            # Release mouse button
            (x, y) = last_found
            pyautogui.mouseUp(x, y, 'left')
            clicking = False
        elif found != None:
            # Hold mouse button
            (x, y) = found
            pyautogui.moveTo(x, y, 0.2f)
            pyautogui.mouseDown(x, y, 'left')
            last_found = found
            print("Clicking at {0}:{1}".format(x, y))
            clicking = True
    time.sleep(0.05f)

Non l'ho provato è per dare un'idea. Potrebbe dare problemi su alcune configurazioni di pc in multi-schermo.