[OpenCV]Winkellage eines rechtecks ermitteln.
-
Hallo.
Ich realisiere gerade ein Bilderkennungsprojekt mit OpenCV.
Ich muss ein fast rechteckiges Objekt erkennen (Winkellage und Position).
Die Position ist kein Problem (schon erledigt). Die Winkellage bereitet mir allerdings etwas Kopfzerbrechen. Das Objekt hat auf einer Seite eine kleine Ausprägung. Die Auptachse des Objekts geht durch diese Auspregung und durch den Objekt mittelpunkt. Nun möchte ich den Winkel zu dieser Achse ermitteln.
Ich habe schon einiges probiert (z.B.: Ermitteln des Winkels über den Vektor objektmittelpunkt-Schwerpunkt). Aber zu ungenau.
Was würdet ihr vorschlagen?____ | | ---- ---- | | | | | | ------------
Objektskizze
-
Hallo.
Hat zwar nichts mit OpenCV zu tun, aber das kannst mit 'Momenten' berechnen.
Auf die schnelle:
http://www.iat.uni-bremen.de/Mitarbeiter/Volosyak/Arbeiten/vol0003.htmlGruß
Michael
-
Wie mit Momenten? Ich habe üer die Momente den Schwerpunkt berechnet und so über den Mittelpunkt der BB den Winkel berechnet. Ist aber zu ungenau.
-
Genau.
Und wenn Du jetzt Momente höherer Ordnung nimmst(hier 2ter Ordnung) kannst Du auch den Winkel berechnen.
Der Mittelpunkt ist ein Moment 0ter Ordnung(oder war es erster Ordnung?)
Wie man den Winkel berechnet steht ja in dem Link. Einfach 0,1 und 2 in die Formel von einsetzen.Die Bounding Box zu nehmen ist übrigens falsch.
Du musst das äquivalente Rechteck bzw. die äquivalente Ellipse Deines Objektes nehmen. Die Bounding Box funktioniert nur in Spezialfällen
Das äquivalente Rechteck ergibt sich aus den Eigenvektoren der Kovarianzmatrix Deines Objektes; ist im 2D-Raum nicht schwer zu berechnen.Gruß
-
Probiert und zu ungenau.
-
Was hast Du probiert?
Die Eigenvektoren?
-
ich habe den Winkel Θ nach der Formel im Link berechnet.
Das problem ist, dass diese Ausprägung verhältnismäßig extrem klein ist, und das Objekt nahezu rechteckig ist.
Ich arbeite auch nicht mit der Bounding Box, sondern mit Der minimalen Bounding Box.
Edit:
Mit der minimalen BB komme ich auf einen Winkel, der idr. in 90° Schritten vom echten abweicht.
-
Moment, wenn du die minimale Bounding Box schon hast, brauchst Du doch nur den Winkel zwischen der x-Achse und einer Seite der Bounding Box auszurechnen.
Natürlich nimmst Du eine der längeren Seiten. Sind beide Seiten gleich lang ist das Ergebniss nicht eindeutig, da gibts auch nichts dran zu drehen..:-)Du musst nur aufpassen, das die beiden Seiten nicht evtl. durch Rundungsfehler gleich lang werden..
//EDIT
Hmmm, ich sehe gerade in einem Paper, dass bei der Berechnung des Winkels evtl. noch eine Fallunterscheidung notwendig ist. Wenn Dich das noch interessiert schreib' ich es mal hier hin.
Gruß