Come posso rilevare i pulsanti in una GUI di un'app con rilevamento di pattern usando Python?


8

Spiegherò prendendo come esempio la GUI dell'app Calcolatrice in Windows. Dato che questa applicazione Calcolatrice è aperta e focalizzata, devo trovare un modo per rilevare tutti i pulsanti. Posso usare solo metodi non intrusivi, quindi cose come l'id pulsante sono fuori questione. Questo mi porta al riconoscimento delle immagini. O meglio dire il rilevamento delle immagini, perché non voglio un'immagine specifica, ma un insieme di immagini che seguono un certo schema. So come posso fare clic / clic con il tasto destro / dbl-click / etc usando una determinata immagine del pulsante e il riconoscimento dell'immagine [1]. Non so come fare al contrario: scansiona la GUI e trova quelle aree che soddisfano i requisiti per essere un pulsante (rettangolo, testo / icona / grafico con etichetta ecc.). Un'attrezzatura più grande sarebbe quella di rilevare elementi che non hanno la forma rettangolare (ad es. Icone su un desktop di Windows)

La cosa più vicina a ciò di cui ho bisogno è rilevare i volti in un'immagine. [2] Ma non so come applicarlo nel mio caso. Per il rilevamento del volto umano, ho visto che centinaia di immagini del viso devono essere utilizzate nella generazione della cascata Haar (non so come farei con solo 10-15 istantanee dei pulsanti). Se un altro tipo di oggetto deve essere rilevato come una mela, è necessario generare nuovamente la cascata Haar per quell'oggetto utilizzando molte immagini.

Qualcuno di voi ha mai provato a rilevare pulsanti, elementi o altro in una GUI usando solo il rilevamento di pattern? Ho solo bisogno di qualcosa che mi dica "questa è un'icona / pulsante" in modo da poter catturare quella regione in un'istantanea.

[1] Uso SikuliX con Python per eseguire azioni su determinati schemi.

[2] Ho visto che questo è fatto facilmente usando OpenCV e Haar cascades (in formato XML). La creazione delle cale Haar richiede un po 'di pazienza e abilità.

Risposte:


7

Innanzitutto, dai un'occhiata all'esempio squares.py fornito da OpenCV. Dovrebbe gestire un discreto numero di tipi di pulsanti con alcune modifiche.

Ecco l'output che ho ottenuto (con qualche modifica) per il tuo esempio di Calcolatrice: inserisci qui la descrizione dell'immagine

Ho apportato le seguenti modifiche all'applicazione dei quadrati:

Modifica questo codice (a partire dalla riga 84):

if(result.total == 4 and 
   abs(cv.ContourArea(result)) > 1000 and 
   cv.CheckContourConvexity(result)):

A questo:

if(result.total == 4 and 
   abs(cv.ContourArea(result)) < 1300 and 
   abs(cv.ContourArea(result)) > 300 and
   cv.CheckContourConvexity(result)):

Inoltre, poiché non devi preoccuparti delle variazioni di scala o rotazione, controlla utilizzando matchTemplate . Inoltre, il tutorial corrispondente (in C ++) è qui .

Vedi la mia altra risposta per un altro esempio di come funziona la corrispondenza dei modelli. Inoltre, potresti trovare questa risposta utile per rilevare le migliori partite X con matchTemplate.

Spero che aiuti!


Grazie mille per la tua risposta. Proverò la tua idea anche se sto cercando qualcosa che possa essere esteso al di fuori di quest'area della calcolatrice. Questo approccio sarebbe perfetto per i pulsanti quadrati. Non so come si comporterebbe per il rilevamento di icone su un desktop di Windows (come ho detto nella spiegazione). Ma ci proverò e lo farò sapere a tutti. Grazie ancora

Quanto deve essere flessibile il tuo programma? Più generale è il problema che si tenta di risolvere; più difficile sarà la soluzione da raggiungere.

Bene, per il momento va bene se mi attengo ai quadrati. Ho problemi più grandi. Come questo (quando eseguo squares.py; Qualche idea?): Traceback (ultima chiamata più recente): File "squares.py", linea 144, in <module> on_trackbar (0) File "squares.py", linea 126, in on_trackbar drawSquares (img, findSquares4 (img, storage)) File "squares.py", linea 30, in findSquares4 pyr = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : l'oggetto 'tupla' non ha attributo 'larghezza'
Radu Enea

Risolto il problema sopra. E dopo molte ricerche, penso di dover riformulare la domanda.
Radu Enea,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.