Abstandsmessung von Lampen mit OpenCV

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Robo
User
Beiträge: 4
Registriert: Mittwoch 10. Januar 2018, 23:54

Guten Tag

Ich bin gerade dabei eine Bildreihenfolge von zwei Lichtquellen (LED, Taschenlampe, etc) über eine Kamera auf zu nehmen. Ich will über Python OpenCV den Abstand der Lichter in Millimeter erfassen.

Das Erfassen der Lichtquellen funktioniert und ich bekomme auch über

....

M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

....

ein Ergebniss.

Nun interessieren mich zwei Dinge

1. Was soll der Wert cx bzw cy darstellen. Position des Lichtes in Pixel?
2. Wie kann ich den Wert cx in eine Längenangabe umwandeln. Also der Abstand von cx(1) zu cx(2). Geht das über eine euklidsche Variante? Hätte mir hierzu jemand einen Code?


Bitte alles einfach halten. Ich bin Anfänger und will eigentlich nur das meine ersten Versuche funktionieren. :lol:
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist der centroid der Kontour. Also im weitesten Sinne der Mittelpunkt.

Da du dein Problem ansonsten faktisch nicht beschreibst, noch dazugehörige Bilddaten zeigst, kann man da sonst nicht viel zu sagen.
Robo
User
Beiträge: 4
Registriert: Mittwoch 10. Januar 2018, 23:54

Und welche Einheit hat dieser Mittelpunkt? Was gibt mir das Ergebniss als 'Wert' cx aus? Sicherlich nicht eine Position in Meter.

Ich hab einen schwarzen Raum mit 2 LED's. Zu Beginn kenn ich den genauen Abstand der LED's cx1 und cx2. Nun verändere ich die Position der LED'S in x-Richtung cx1.1 und cx2.2. Jetzt hätte ich gerne den neuen Abstand der LED'S.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Einheit ist Pixel.

Und dein Problem nennt sich pose estimation. Dazu brauchst du üblicherweise eine kalibrierte Kamera. Und die OpenCV hat dazu schon eingebaute Funktionen. Für beides.

Falls dein problem aber sehr viel simpler ist, weil die LEDs sich nur in einer Geraden bewegen, sollte eigentlich eine Homographie ausreichen. Auch dafür gibt es Funktionen. Aber auch die setzt eine kalibrierte Kamera voraus.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um das nochmal etwas detaillierter darzustellen: es ist wichtig, die Kamera zu Kalibrieren, weil man nur dann weiß, wie sich die perspektivische Verkürzung auf die Abbildung de LEDs auf den Kamerasensor auswirkt. Hast du eine lange Brennweite, ist der Effekt gering. Hast du eine kurze Brennweite, ist die Veränderung größer. In beiden Fällen, allerdings stärker bei kurzen Brennweiten, hast du auch noch mit nicht-linearen Verzerrzerrungen zu kämpfen. Extremfall: Fischaugenobjektiv.

Und wenn die Kamera kalibriert ist, kannst du zwei Datensätze erstellen: einmal den echten Abstand der LEDs voneinander, und auf dem Bildschirm in Pixeln. Und das dann wiederum in 3 oder mehr Positionen voneinander verschoben auf der Achse der Bewegung. Dabei fällt dann ein Datensatz mit zb 6 Koordinaten im echten Abstand, und auf dem Bildschirm raus. Und damit rufst du findHomography auf. Die berechnet dir dann die Abbildung von einem Satz Koordinaten auf den anderen. Das ist nix anderes als eine simple Matrix.

Und die kannst du dann immer mit den Bildschirmkoordinaten deiner LEDs multiplizieren und kennst dann die Weltkoordinaten.
Robo
User
Beiträge: 4
Registriert: Mittwoch 10. Januar 2018, 23:54

Ah verstehe.

Würe die Kalibrierung entfallen, wenn meine LED sich ausschließlich horizontal in einem gleich bleibenden definiertem Abstand zur Kamera hin und her bewegen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schau dir das Bild mal an, und dann solltest du dir die Frage selbst beantworten koennen.

Bild
Antworten