Comment puis-je détecter des boutons dans l'interface graphique d'une application avec détection de modèle à l'aide de python?

8

Je vais vous expliquer en prenant comme exemple l'interface graphique de l'application Calculatrice dans Windows. Étant donné que cette application Calculatrice est ouverte et ciblée, je dois trouver un moyen de détecter tous les boutons.Je ne peux utiliser que des méthodes non intrusives, donc des choses comme l'ID du bouton sont hors de question. Cela m'amène à la reconnaissance d'image. Ou mieux dire la détection d'image, car je ne veux pas d'une image spécifique, mais d'un ensemble d'images qui suivent un certain modèle. Je sais comment je peux cliquer / cliquer avec le bouton droit / dbl-cliquer / etc en utilisant une image de bouton et une reconnaissance d'image données [1]. Je ne sais pas comment je peux faire l'inverse: scanner l'interface graphique et trouver les zones qui répondent aux exigences d'être un bouton (rectangle, texte / icône / graphique étiqueté, etc.). Un plus gros tacle serait de détecter les éléments qui n'ont pas la forme d'un rectangle (par exemple des icônes sur un bureau Windows)

La chose la plus proche de ce dont j'ai besoin est de détecter les visages dans une image. [2] Mais je ne sais pas comment appliquer cela dans mon cas. Pour la détection de visage humain, j'ai vu que des centaines d'images du visage devaient être utilisées dans la génération de la cascade Haar (je ne sais pas comment je ferais cela avec seulement 10 à 15 instantanés de boutons). Si un autre type d'objet doit être détecté comme une pomme, vous devez générer à nouveau la cascade de Haar pour cet objet en utilisant beaucoup d'images.

Avez-vous déjà essayé de détecter des boutons, des éléments ou quoi que ce soit dans une interface graphique en utilisant uniquement la détection de modèle? J'ai juste besoin de quelque chose pour me dire "c'est une icône / un bouton" afin que je puisse saisir cette région dans un instantané.

[1] J'utilise SikuliX avec Python pour effectuer des actions sur des modèles donnés.

[2] J'ai vu que cela se fait facilement en utilisant les cascades OpenCV et Haar (au format XML). La création des cacades Haar nécessite un peu de patience et de compétences.

Radu Enea
la source

Réponses:

7

Tout d'abord, jetez un œil à l' exemple squares.py fourni par OpenCV. Il devrait gérer un bon nombre de types de boutons avec quelques ajustements.

Voici la sortie que j'ai obtenue (avec quelques ajustements) pour votre exemple de calculatrice: entrez la description de l'image ici

J'ai apporté les modifications suivantes à l'application des carrés:

Modifiez ce code (à partir de la ligne 84):

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

Pour ça:

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

De plus, puisque vous n'avez pas à vous soucier des variations d'échelle ou de rotation, essayez d'utiliser matchTemplate . De plus, son tutoriel correspondant (en C ++) est ici .

Voir mon autre réponse pour un autre exemple du fonctionnement de la correspondance de modèles. En outre, cette réponse peut vous être utile pour détecter les correspondances X les plus importantes avec matchTemplate.

J'espère que cela pourra aider!

mevatron
la source
Merci beaucoup pour votre réponse. Je vais essayer votre idée bien que je recherche quelque chose qui puisse être étendu en dehors de cette zone de calculatrice. Cette approche serait tout simplement géniale pour les boutons carrés. Je ne sais pas comment cela se comporterait pour détecter des icônes sur un bureau Windows (comme je l'ai mentionné dans l'explication). Mais je vais l'essayer et je le ferai savoir à tout le monde. Merci encore
Dans quelle mesure votre programme doit-il être flexible? Plus le problème que vous essayez de résoudre est général; plus la solution sera difficile à réaliser.
Eh bien, pour le moment, ça va si je m'en tiens aux carrés. J'ai de plus gros problèmes. Comme celui-ci (lorsque j'exécute squares.py; une idée?): Traceback (dernier appel le plus récent): fichier "squares.py", ligne 144, dans <module> on_trackbar (0) Fichier "squares.py", ligne 126, dans on_trackbar drawSquares (img, findSquares4 (img, storage)) Fichier "squares.py", ligne 30, dans findSquares4 pyr = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : l'objet 'tuple' n'a pas d'attribut 'width'
Radu Enea
Résolu le problème ci-dessus. Et après beaucoup de recherches, je pense que je dois reformuler la question.
Radu Enea