Erkennung geometrischer Formen

Crashdowns

Ensign
Registriert
Juni 2010
Beiträge
138
Frohe Weihnachten alle zusammen!
Ich habe mal wieder eine Frage;)
Ist es möglich mit Hilfe von C/C++ ein Programm zu erstellen welches gemometrische Figuren erkennt?

Beispiel:
Auf einem vorher definiertem Bereich des Bildschirmes taucht ein viereck auf --> Aktion1
Taucht ein Dreieck in dem Bereich auf folgt aktion 3, usw
sowie deren Kombinationen --> kommen kreis und viereck folgt Aktion 12

Lässt sich sowas mittels c/C++ relaisieren? Oder habt ihr einen anderen Vorschlag bzw noch besser falls es ein Open Source Software geben würde die man für diese Zwecke anpassen könnte.

Ich danke ich euch für eure Antworten!!
 
Soll das Erkennungsproblem die Formen auch erstellen, oder macht das eine andere Anwendung?

Wenn ersteres der Fall ist, würde ich versuche die Eigenschaften des Objektes abzufragen, anhand derer man entscheiden könnte um was es sich handelt.
 
Die Formen werden von einer externen Software ausgegeben auf die keinerlei Einfluss möglich ist. Es stehen quasi nur die Pixel auf dem Bildschirm zur Verfügung;)
 
Zuletzt bearbeitet:
Das geht natürlich schon, ist aber nicht gerade trivial.. Sind die Formen ausgefüllt? Verschiedenfarbig? Vor einem Hintergrund? Bewegen sie sich? Beschreib mal genauer..

Ich denke an eine Art Screenshot-Programm mit anschließender Bilderkennung..
 
Ich denke an eine Art Screenshot-Programm mit anschließender Bilderkennung..

Sowas hatte ich mir erhofft;)
Also es gibt vier 'Grundformen mit je 10-15 anderen Zeichen davor (Zahlen oder Einfache Großbuchstaben).
Die Formen sind ausgefüllt und haben aber zum Teil leider die selben Farben. 2 x Farbe 1 + 2 x Farbe 2. sie bewegen sich nicht. Es kann nur passieren das nach x Sekunden noch ein weiteres Zeichen erscheint (Zeichen 1 erscheint--> Aktion 1, dann erscheint Zeichen 2 --> Aktionskombination aus 1 und 2).

Jap,sie tauchen vor einem Hintergrund auf, der momentan weiß sein sollte (im näherem umfeld, danach anders farbig).
 
Zeichen? Figuren? Ich bin verwirrt. Jedenfalls dachte ich gerade. falls die Figuren immer gleich groß sind und die Zahlen oder Buchstaben egal, dann könntest du evtl. über den Umfang unterscheiden. Es fehlt hier die GENAUE Problembeschreibung..
 
Ok, mir ist gerade ein gutes Beispiel eingefallen wie man mein Problem bildlich darstellen könnte;)
Nehmen wir ein Kartenblatt. Herz, Karo, Pik und Kreuz. Herz und Karo sind Rot, Kreuz und Pik schwarz. Vor dem Symbol (Pik, Herz, Karo, Kreuz) stehen Zahlen bzw. die Zeichen für Bube, Dame, König, Ass.
Ziel des Programmes wäre es in diesem Beispiel zu erkennen welche Karte zu sehen ist. Kommt ein Karo König --> Aktion 1, kommt ein Karo König und eine Karo Dame --> Aktion 12.

Die Karten bewegen sich natürlich nicht, aber es tauchen nach und nach neue "Karten" auf dem Bildschirm auf (bis zu 6).

Ich hoffe ich konnte das Problem mit Hifle der Karten Metapher verdeutlichen;)
 
D.h. die Figuren kommen immer gleich groß und im rechten Winkel und unbewegt? Dann könntest Du doch einen einfachen Vergleich mit entsprechenden Vorlagen machen und ggf. einen Schwellenwert einbauen. Also einfach Differenz zwischen Vorlage und Anzeige kleiner Schwellenwert -> "Karte" erkannt. Fehlt "nur noch" der Weg dorthin.
 
Wie ich vorgehen würde.
Pixel in eine Matrix einlesen.
Danach eine Raster über die Matrix legen dessen Punkte auf Farbe überprüft werden. (Abstand des rasters entspricht der minimalen größe einer Form)
Und dann einfach bei einem Treffer die Umgebung des Pixels überprüfen auf gültige Formen.
Würd mir da einfach die Eckpunkte der Formen raussuchen, entsprechend mit 2 dimensionalen vectoren verbinden. Mit diesen Informationen sollte das erkennen kein Problem mehr sein.

Formdefinition:
4 Eckpunkte 4 Vectoren bei dem 1 parameter 0 ist und alle anderen parameter equivalent
--> Quadrat
 
Zuletzt bearbeitet:
ich würd sagen das hört sich doch ziemlich gut an!
wie bekomm ich die vorlagen am besten in matrix eingelesen?
 
Ich hab jetzt absichtlich nicht an höhere Mathematische verfahren gedacht. Geh davon aus das Crashdowns damit nix anfangen könnt.

Die Vorlagen speichest nicht in die Matrix.
Du parst die Matrix nach Formen eine Form besteht aus Eckpunkten welche über Vectoren miteinander verbunden sind.
Welche Form das ist musst dann einfach ausprogrammieren. Sollte nicht sonderlich kompliziert werden fangst dann einfach an mit einem Quadrat dann Rechteck Dreieck etc.
Kreis ist etwas komplizierter wennst dabei hängst kannst mich dann fragen.
 
Sowas ist in Minuten realisierbar aber kann auch echt komplex werden...
Am besten wäre echt mal ein Screenshot - oder ist das mit den Spielkarten schon der Anwendungsfall? Pokerbot? Hatte ich auch schonmal überlegt, ist sicher machbar und schon im Einsatz

Das erkennen der Muster/Bilder und identifizieren der Zeichen/Zahlen ist sehr einfach, da die Symbole ja von einem Programm dargestellt werden und daher auf den Pixel genau identisch bleiben. Du brauchst also kein Ähnlichkeitsmaß oder irgendeinen Klassifikator/OCR sondern einfach nur nachschlagen in einer "Zeichendatenbank". Außerdem sind ja die Positionen der zu erkennenden Objekte sehr genau bekannt (Relativ zur Fensterposition der Pokeranwendung - deine Karten zB unten und der River in der Mitte)

Schwieriger wäre eine Klassifikation wenn du zB handgemalte Bilder von Spielkarten vor eine Webcam hälst und diese die Karte erkennen soll - obwohl auch das noch "einfach" sein sollte, da es nur wenige und vorher bekannte Möglichkeiten gibt.

Hast du denn schon die Möglichkeit Screenshots zu erstellen und eine Library die es dir erlaubt die Pixel des Bildes auszulesen? Die evtl bekannteste/verbreitetste Bildverarbeitungs-Lib ist openCV - aber evtl. ist das auch overkill bei einer so "einfachen" Anwendung.

Wenn du mal die mühsame Vorarbeit geschafft hast (Screenshot in dein Programm laden und diesen Pixelweise lesen können) kann dir hier sicher jeder schnell helfen den Rest zu realisieren.

Falls du dich echt einlesen willst:
http://de.wikipedia.org/wiki/Bildverarbeitung
http://de.wikipedia.org/wiki/Segmentierung_(Bildverarbeitung)
http://de.wikipedia.org/wiki/Musteranalyse

Aber da du ja keine "unscharfe Information" (Realwelt Fotos/Videos) verarbeitest sondern nur 1:1 Wiedererkennung brauchst ist das sicher auch ohne komplizierte Verfahren machbar.

edit:
Insbesondere für Kreise, Linien und einfache geometrische Objekte eignet sich z.B. die Hough-Transformation oder auch die Momenten-Methode. Würde beides auch funktionieren, wenn die Position und/oder Größe der Objekte Variiert, ist beides extrem schnell und auch einfach zu implementieren.
 
Zuletzt bearbeitet:
Zurück
Oben