PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Praxisorientierte Bilderkennung mit Roboter-Ein paar Fragen



skg-rob
11.07.2010, 16:59
Hallo Leute.

Wie oben schon beschrieben überlege ich gerade bei unseren Robotern die Bilderkennung einzuführen. Vorher stellen sich mir jedoch einige Fragen.

Zu aller erst: Ich kenne mich mit C++ aus, allerdings beschränken sich meine Kenntnisse auf das nötigste (ich habe nie richtig programmieren gelernt, sondern von Anfang an mit den QFix Bibliotheken gearbeitet. Wer die kennt, wird wissen was ich meine). Allerdings ist für die nächsten Wochen eine "Weiterbildung" angesetzt.


Also, wofür brauche ich die Bilderkennung?

Es geht um einen Roboter der Fußball spielt. Mit der Kamera soll er den Gegner im Tor erkennen, bzw. die Stelle wo das Tor frei ist. Der Roboter arbeitet autonom, ich kann im also nur den Algorithmus zur Abstraktion einpflanzen und ein Programm um das entstandene Bild auszuwerten.

Genauer: Das Spielfeld hat einen grünen Boden, schwarze Banden und eine Vertiefung in der Wand als Tor. Die Tore sind farbig. Was ich also machen will:
1. Den grünen Boden und alles was über der Bande ist ignorieren. Also alles grüne löschen, dann die Kante für die Bande erkennen oder alles was nicht der Farbe der Bande und des Tores entspricht ignorieren.
2. Die Kante Tor/Bande erkennen. Ich habe etwas über Matrizen gelesen, die man anwenden kann aber dazu später mehr.
3. Die Kante gegnerischer Roboter/Tor erkennen
4. Die Größe des Tores mit der Höhe der Bande verrechnen um die tatsächliche, Entfernungsunabhängige Größe zu bestimmen, also ob genug Platz ist für den Ball etc.
5. Schauen ob das ganze den in der Mitte des Bildes ist, also ob man schon schießen kann oder weitermachen soll wie bisher. Daraus folgt: Ein Stream dient als Ausgangsmaterial!

Was ich bisher weiß und meine Fragen:

Ich habe das gute Tutorial hier in der RN Knowledge Base gelesen. Leider ist das doch sehr kurz und die meisten Fragen bleiben offen:
1. Wie funktioniert das mit der BE? Gibt es spezielle Programme um einen Algorithmus zu entwickeln?
1.1. Ich habe im Tutorial die Matrizen gesehen. Aber wie wende ich diese auf das Bild an? Ich kann schlecht sagen nimm diese Matrix und wende sie auf jedes Pixel an. Kommen da wieder spezielle Entwicklungstools/Software zum Einsatz?
2. Ist so etwas überhaupt realisierbar, was ich vorhabe? Oder ist das schon eine eher komplexere Angelegenheit?
3. Was brauche ich also? Als erstes natürlich eine Kamera. Aber dann? Das Bild muss ja ausgewertet werden. Geschieht das über einen Prozessor in der Kamera oder muss ich die Daten immer an mein Board weitergeben? Entwicklungssoftware?
4. Wenn ich das Bild also ausgewertet habe und anhand des Verhältnisses Bandenhöhe/Törgröße sagen kann, dass farbige Rechteck ist xcm breit, muss dass dem Board mitgeteilt werden! Welche Outputs gibt es bei Kameras?


Entschuldigt wenn es dieses Thema schon tausendmal gab, aber ich habe bisher im Net noch nichts gefunden was mir viel weitergeholfen hätte. Also immer her mit Links, wenn ihr nützliche Seiten kennt!

Achja, fast vergessen: Wie gesagt arbeiten wir mit einem QFix Soccerboard (ATMega 128, i²c, digital und analog Eingägne). Windows oder Linux ist egal, letzteres wäre mir aber fast lieber, da dort unsere komplette Programmierung abläuft.

Vielen Dank jetzt schon mal für eure Mühe! mfg skg-rob



Edith sagt: Im Anhang seht ihr das Spielfeld, meine Erläuterungen können ziemlich unverständlich sein.

Und nochmal Edit: Ich habe auch noch schnell ein vereinfachtes Bild der Kamera gemalt.

avr_mcu
11.07.2010, 18:11
Als Anregung: Google mal nach den Schlagworten "OpenCV+Tutorial"
damit findest du bestimmt eine Menge Infos und Hinweise dein Vorhaben anzugehen.
Viel Erfolg und Grüße,
Stefan

skg-rob
11.07.2010, 18:23
Vielen Dank ich werde es mir anschauen.

Felix G
12.07.2010, 23:31
Also bei dieser Anwendung kannst du dir komplizierte Algorithmen eigentlich sparen...

Es ist doch so, daß dich ausschließlich die Tore interessieren, und die haben jeweils eine Farbe die sonst nirgends vorkommt. Wenn du also dein Kamerabild hast, musst du darin nur alle Pixel mit der richtigen Farbe suchen, und deren Schwerpunkt bestimmen. Das ist dann ganz automatisch der Mittelpunkt der (sichtbaren) Torfläche, und du kannst schießen sobald dieser Schwerpunkt in der Nähe der Bildmite liegt. Nur wenn der gegnerische Bot niedriger wäre als das Tor (so daß über dem Bot noch ein Streifen in der Torfarbe sichtbar ist) müsste man das zusätzlich noch berücksichtigen.

Du brauchst also keine Kantendetektion, keine Mustererkennung und auch sonst keine aufwendige Bildverarbeitung.


[edit]
kleine Korrektur:
wenn der Bot natürlich so steht wie auf dem Bild, funktioniert der Ansatz so nicht direkt...
In diesem Fall müsstest du - ausgehend vom ersten gefundenen Pixel mit der richtigen Farbe - eine Art Floodfill* durchführen um eine zusammenhängende Fläche zu erhalten. Wenn von den angrenzenden Pixeln keine mehr die richtige Farbe haben, durchsucht man den Rest des Bildes und macht wieder ein Floodfill, sobald ein Pixel mit der passenden Farbe gefunden wurde. Am Ende hast du dann mehrere Flächen von denen du nurnoch die richtige (z.B. die mit den meisten Pixeln) auswählen, und den Schwerpunkt berechnen musst.


(*)Floodfill geht im wesentlichen so:
1. aktueller Pixel hat die richtige Farbe?
2. markiere den aktuellen Pixel und wiederhole den Algorithmus für alle angrenzenden, nicht markierten Pixel

Das lässt sich sehr einfach rekursiv implementieren, denn man benötigt im wesentlichen nur eine Funktion die prüft ob der übergebene Pixel die richtige Farbe hat, und sich dann selbst für alle 4 (oder 8 ) benachbarten Pixel aufruft.

skg-rob
13.07.2010, 19:56
Vielen Dank Felix.

Ja das ist eine gute Idee. Man kann dann auch noch eine Mindestgröße der Fläche festlegen die berücksichtigt werden soll (wenn der Gegner z.B. löchrig ist sollte man ihn eben erkennen). Vermutlich ist das schlauer als mit Kanten zu rechnen und auch schneller in der Verarbeitung. Leichter zu programmieren sowieso.

Welche Hard und Software empfiehlst du? Bei der Hardware ist zu sagen, dass die Kamera selber möglichst wenig Brennweite haben sollte, es kann durchaus vorkommen dass man 5cm von der Bande entfernt ist.

oratus sum
20.07.2010, 14:45
Hallo,

Das mit der Matrix habe ich angewendet um in einem Bild den hellsten Lichtfleck zu ermitteln.

Das Prinzip ist eigentlich gleich, die Matrix an sich, ist dein Bild, das ja eine Punktmatrix ist.

http://www.techgeek.at/?page_id=255