Wie kann ich Schaltflächen in einer GUI einer App mit Mustererkennung mithilfe von Python erkennen?


8

Ich werde die GUI der Calculator-App in Windows als Beispiel erläutern. Angesichts der Offenheit und Fokussierung dieser Rechneranwendung muss ich einen Weg finden, alle Schaltflächen zu erkennen. Ich kann nur nicht aufdringliche Methoden verwenden, sodass Dinge wie die Schaltflächen-ID nicht in Frage kommen. Dies führt mich zur Bilderkennung. Oder besser gesagt, Bilderkennung, weil ich kein bestimmtes Bild möchte, sondern eine Reihe von Bildern, die einem bestimmten Muster folgen. Ich weiß, wie ich mit einem bestimmten Schaltflächenbild und einer bestimmten Bilderkennung auf / Rechtsklick / Doppelklick / usw. klicken kann [1]. Ich weiß nicht, wie ich es umgekehrt machen kann: Scannen Sie die GUI und finden Sie die Bereiche, die den Anforderungen einer Schaltfläche entsprechen (Rechteck, Text / Symbol / Grafik usw.). Ein größeres Problem wäre, Elemente zu erkennen, die nicht die Rechteckform haben (z. B. Symbole auf einem Windows-Desktop).

Das nächste, was ich brauche, ist das Erkennen von Gesichtern in einem Bild. [2] Aber ich weiß nicht, wie ich das in meinem Fall anwenden soll. Für die Erkennung des menschlichen Gesichts habe ich gesehen, dass Hunderte von Bildern des Gesichts in der Haar-Kaskadengeneration verwendet werden müssen (ich weiß nicht, wie ich dies mit nur 10-15 Schnappschüssen machen würde). Wenn eine andere Art von Objekt wie ein Apfel erkannt werden muss, müssen Sie erneut eine Haar-Kaskade für dieses Objekt mit vielen Bildern generieren.

Hat jemand von Ihnen jemals versucht, Schaltflächen, Elemente oder was auch immer in einer GUI nur mit Mustererkennung zu erkennen? Ich brauche nur etwas, um mir zu sagen, dass dies ein Symbol / eine Schaltfläche ist, damit ich diese Region in einem Schnappschuss erfassen kann.

[1] Ich benutze SikuliX mit Python, um Aktionen für bestimmte Muster auszuführen.

[2] Ich habe gesehen, dass dies mit OpenCV- und Haar-Kaskaden (im XML-Format) problemlos möglich ist. Das Erstellen der Haar-Kakaden erfordert ein wenig Geduld und Können.

Antworten:


7

Schauen Sie sich zunächst das von OpenCV bereitgestellte Beispiel squares.py an. Es sollte eine ganze Reihe von Schaltflächentypen mit einigen Anpassungen verarbeiten.

Hier ist die Ausgabe, die ich (mit einigen Optimierungen) für Ihr Taschenrechner-Beispiel erhalten habe: Geben Sie hier die Bildbeschreibung ein

Ich habe die folgenden Quadrate an der Quadratanwendung vorgenommen:

Ändern Sie diesen Code (beginnend in Zeile 84):

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

Dazu:

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

Da Sie sich keine Gedanken über Skalierungs- oder Rotationsschwankungen machen müssen, sollten Sie MatchTemplate verwenden . Das entsprechende Tutorial (in C ++) finden Sie hier .

In meiner anderen Antwort finden Sie ein weiteres Beispiel für die Funktionsweise des Vorlagenabgleichs. Diese Antwort ist möglicherweise auch hilfreich, um die Top-X-Übereinstimmungen mit zu ermitteln matchTemplate.

Ich hoffe, das hilft!


Vielen Dank für Ihre Antwort. Ich werde Ihre Idee ausprobieren, obwohl ich nach etwas suche, das außerhalb dieses Taschenrechnerbereichs erweitert werden kann. Dieser Ansatz eignet sich hervorragend für quadratische Tasten. Ich weiß nicht, wie es sich beim Erkennen von Symbolen auf einem Windows-Desktop verhalten würde (wie in der Erklärung erwähnt). Aber ich werde es versuchen und alle wissen lassen.

Wie flexibel muss Ihr Programm sein? Je allgemeiner das Problem, das Sie zu lösen versuchen; desto schwieriger wird es sein, die Lösung zu erreichen.

Nun, im Moment ist es in Ordnung, wenn ich mich an die Quadrate halte. Ich habe größere Probleme. Wie diese (wenn ich squares.py ausführe; Irgendeine Idee?): Traceback (letzter Aufruf zuletzt): Datei "squares.py", Zeile 144, in <module> on_trackbar (0) Datei "squares.py", Zeile 126, in on_trackbar drawSquares (img, findSquares4 (img, storage)) Datei "squares.py", Zeile 30, in findSquares4 pyr = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : 'Tupel'-Objekt hat kein Attribut' Breite '
Radu Enea

Das obige Problem wurde behoben. Und nach vielen Recherchen muss ich die Frage umformulieren.
Radu Enea

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.