PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erkennung von Markierungen auf einem (Kamera-)Bild



Felix G
12.06.2007, 18:53
Hallo Leute,

ich wüsste gern wie ich bestimmte Markierungen auf einem Bild wiederfinden kann.


Also angenommen ich klebe irgendwelche Markierungen z.B. einfach mal irgendwo an die Wand und mache ein Foto davon. Dann habe ich ja einige Probleme:

1. Die Größe der Markierungen ist nicht bekannt (und natürlich auch nicht konstant)

2. Die Markierungen können irgendwie verdreht sein, z.B. weil ich sie nicht alle in der gleichen Orientierung aufgeklebt habe.

3. Die Markierungen sind mehr oder weniger stark verzerrt, da das Foto natürlich aus irgendeinem beliebigen Winkel aufgenommen wurde.


Als Ergebnis brauche ich die Koordinaten aller auf dem Bild (vollständig) sichtbaren Markierungen, samt ihrer Orientierungen (also der Winkel um den eine Markierung gegenüber der X-Achse des Bildes verdreht ist).


Vielleicht kann mir ja Jemand verraten wie sowas üblicherweise gemacht wird, denn im Internet wurde ich bisher nicht fündig (bzw. es war bei vergleichbaren Aufgaben immer zumindest die Größe der zu erkennenden Objekte bekannt).


Gruß,
Felix

NumberFive
13.06.2007, 05:41
Wenn du eine Ansatz hast bitte melde dich habe zwar schon einiges probiert aber nie zu ein gescheiten ergebnis gekommen.

Mein weg nach Grau dann nach schwarz weiß kanten raus und jetzt ja wie weiter.

Gruß

ogni42
13.06.2007, 18:50
Wenn Du die Markierungen im Bild findest (z.B. nach einer Binarisierung ist nur noch die Markierung im Bild zu sehen) könntest Du erst die Verschiebung kompensieren (z.B. mit Schwerpunktbestimmung und umschließendem, schwerpuntkzentrierten Rechteck).

Danach kannst Du per Bestimmung des Flächenträgheitsmoments oder per Karhounen-Loéve-Transformation die Rotation bestimmen (da sollte eine Verzerrung in der z-Achse eigentlich keinen Einfluss haben, musst Du aber testen).

Felix G
13.06.2007, 19:52
Das klingt ja alles schön und gut, aber nach einer Binarisierung kann ja immernoch einiges auf dem Bild sein was keine Markierung ist. Die Markierungen überhaupt erstmal zu finden ist ja eigentlich das zentrale Problem.

ogni42
14.06.2007, 13:00
Mit "finden" meinte ich: Die Markierung ist im Bild sichtbar.

Sofern Du eine Farbkamera verwendest, könntest Du die Markierung in einer Farbe wählen, die in der Szene sonst nicht vorkommt (oder nur bei Objekten, die kleiner sind als die Markierung). Im binarisierten Bild, das durch Auswahl der entsprechenden Farbe aus dem Farbbild entsteht, kannst Du dann die anderen Objekte durch Erosion entfernen. Dieses Bild ist dann eine Maske mit der Du im ursprünglich binarisierten Bild Deine Markierung wieder findest.

scales
14.06.2007, 15:09
ich hab grade auch sowas programmiert, allerdings war das bild nicht gedreht und die symbole immer gleich groß.

ich hab einfach die symbole wie das bild von der kamera als rgb-array gespeichert und durchsuch dann das bild nach den arrays (natürlich mit nem bestimmten schwellwert, ganz über einstimmen wird das nie)

bei mir funktioniert das wirklich gut, nur mit den unterschiedlichen lichtverhältnissen gibts manchmal probleme, aber da muss man dann halt den algortihmus anpassen.

wie man das mit drehung und skalierung hinbekommen könnte würde mich auch interessieren, ist mir noch nix eingefallen

Felix G
14.06.2007, 16:13
Ok, also nehmen wir einfach mal an die Markierungen seien schwarz, und auf einem hellen Untergrund beliebiger Farbe angebracht. Und nehmen wir weiterhin an, sie könnten auf dem Bild in unterschiedlich hellen Bereichen liegen (eine könnte ja direkt vom Sonnenlicht beleuchtet sein, während andere im Halbschatten liegen).


Die Lichtverhältnisse müssen dann bei der Binarisierung berücksichtigt werden, aber das sollte ja machbar sein. (vielleicht indem man erstmal einen extremen Weichzeichner über das Bild jagt oder so)

Das Ergebnis wäre also ein S/W-Bild in dem die Markierungen zu sehen sind, und zusätzlich noch eine ganze Menge "Müll" (man würde ja auch jedes dunkle Objekt, und evtl. noch einige Schatten auf diesem Bild sehen).

Wie die Fehler (die ja durchaus eine ähnliche Größe haben können wie die Markierungen) aus diesem Bild durch Erosion entfernt werden sollen sehe ich noch nicht so ganz. Mir ist aber aufgefallen, daß die Verarbeitung stark vereinfacht würde, wenn man auf diesem Bild einfach nur alle zusammenhängenden schwarzen Flächen sucht, und auf eine einheitliche Größe skaliert. Dann müsste nurnoch die Form erkannt werden, vielleicht mit einem Neuronalen NEtz oder irgendeinem anderen Verfahren

Johannes
16.06.2007, 09:57
Hi,
das Problem mit den unterschiedlichen Lichtverhältnissen kann man leichter in den Griff bekommen, wenn man statt RGB das HSV-Farbformat verwendet (http://en.wikipedia.org/wiki/HSV_color_space). Der eine der drei Farbwerte gibt die Helligkeit an, während die anderen für Farbton und Sättigung stehen. Die letzteren sollten (zumindest theoretisch) bei verschiedenen Beleuchtungsstärken konstant sein, da sich nur der erste ändert. Funktioniert in Wirklichkeit natürlich nur bei perfekt weißem Licht.

Felix G
16.06.2007, 17:59
Naja, wenn man von schwarzen Markierungen auf hellem Grund ausgeht, könnte man auch beim HSV-Farbraum nur den Kanal für die Helligkeit nutzen.


Ich habe inzwischen jedenfalls mal ein bischen mit Matlab an einem simulierten Bild herumexperimentiert, und relativ vielversprechende Ergebnisse erhalten.

Das Testbild war ein Würfel mit je 3x3 Markierungen (deren Form ich willkürlich gewählt habe) auf jeder Seite. Alle Markierungen sind irgendwie verdreht, und zusätzlich habe ich auf einer Seite die Größe der Markierungen variiert.

http://www.mad-clan.de/erg1a.jpg

Wie man sieht gibt es auf dem Testbild deutliche Helligkeitsschwankungen. Ich habe versucht sie auszugleichen indem ich das Originalbild durch eine extrem unscharfe Version (64x64er Weichzeichner) geteilt habe. Das resultierende Bild sah zwar nicht mehr besonders schön aus, ließ sich aber problemlos binarisieren.

Zur weiteren Verarbeitung des Bildes hat Matlab zwei verdammt praktische Funktionen "bwlabel" und "regionprops", die einem eine Menge Arbeit ersparen.

Mit bwlabel werden zusammenhängende Gebiete im Binärbild gesucht und durchnummeriert. Die Funktion regionprops kann dann eine ganze Menge Informationen zu diesen Gebieten ermitteln, wie z.B. die Position des Schwerpunkts (im oberen Bild rot markiert), und die boundingbox (also das kleinste das Gebiet umschließende Rechteck).

Naja, und wenn man die von regionprops gelieferten Daten halbwegs sinnvoll einsetzt, schaut das Ergebnis so aus:

http://www.mad-clan.de/erg1b.jpg

32 Bilderchen gleicher Größe, wobei jedes eines der gefundenen Gebiete enthält.

Jetzt stellt sich nurnoch die Frage wie man von hier aus weitermachen kann, denn die Bilder haben jetzt zwar alle die gleiche Größe, aber es muss noch für jedes Bild festgestellt werden ob es eine der gesuchten Markierungen ist oder nicht. (außerdem muss noch die Rotation bestimmt werden)


Gruß,
Felix

ogni42
17.06.2007, 18:16
Rotationswinkel: KLT bzw. FLT => Winkel, dann in Hauptachse rotieren (z.B. auf 0°), Danach mit Suchmuster korrelieren (Kreuzkorrelation) und schwelle bilden.

Felix G
17.06.2007, 19:53
Ok, also ich nehme an mit FLT meinst du das bereits erwähnte Flächenträgheitsmoment...

leider habe ich dazu aber kaum was im Internet finden können, und wie man damit die Hauptachse errechnet steht scheinbar auch nirgends.

Also ein paar Links zu Seiten auf denen die Berechnung des Flächenträgheitsmoments und/oder der Hauptachse beschrieben ist wären schon hilfreich.

ogni42
17.06.2007, 21:40
Such mal nach geometrischen Momenten 2. Ordnung. Ich habe mir das vor Jahren aus Büchern zusammen gesucht...