PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Berechnung von 3D Koordianten aus 2 Bildern



MrNiemand
18.07.2006, 15:03
Hallo,

Ich habe 2 Kamerabilder die in definiertem Abstand voneinander gemacht worden sind. (So wie das beim menschlichen Sehen ja auch läuft)

Jetzt würde ich gerne wissen, wie ich die Entfernung usw. eines Messpunktes aus den 2 Kamerabildern berechnen kann. Ich hab mittlerweile nen halben Block vollgekritzelt, komme aber nichtmal ansatzweise auf eine Lösung.

Wär genial, wenn mir da jemand weiterhelfen könnte.

PicNick
18.07.2006, 15:14
Da ist ein Punkt im Raum "P"
der bildet sich am linken und rechten Bild ab.
X1 u. X2 sind die Punktbabstände von der BildMitte
Z ist der Augenabstand vom Bild
h ist der Punktabstand vom Bild



schau mal, ob du zurechtkommst

PicNick
18.07.2006, 15:23
Anm: Die Sache ist natürlich anders, wenn die zwei Kameras schielen, also auf das Objekt ausgerichtet sind.

MrNiemand
18.07.2006, 15:42
Wow, so schnell hatte ich nicht mit Antwort gerechnet, danke schonmal für die Mühe :)
Wie kann man den H bzw Z messen?
Funktioniert das auch wenn P rechts neben der rechten Kamera ist?
Und wie kann man dann die Objekthöhe relativ zur Kamerahöhe berechnen?

PicNick
18.07.2006, 15:58
H + z ist ja das Ergebnis.
Wissen tust du ja den Augenabstand a und die zwei Bildabstände X1 u. X2
Das sind alles einfach ähnliche Dreiecke, das funktioniert immer. Du mußt natürlich X1 u. X2 vorzeichenrichtig verwenden.
Am besten bei einem bekannten Punkt nachvollziehen und nachrechnen. d

die Höhe geht ja ähnlich, eben von der Seite, augenhöhe mußt du wissen.

MrNiemand
18.07.2006, 16:16
Hm, dann steh ich da noch etwas auf dem Schlauch, im Endeffekt will ich ja H+Z wissen, d.h. die Entfernung zum Messobjekt von meinen Kameras, also der Mitte vom Aufbau wissen, aber wie kann ich die Formeln so umstellen das das hinhaut? ich lande immer wieder bei Käse wenn ichs versuche.
Wobei ich mittlerweile kapiert habe, wie du auf die Formeln gekommen bist :)

PicNick
18.07.2006, 17:49
Die erste Frage ist nach z. das weiß man ja meist nicht so genau
das große Dreieck Linkes Auge<-->Rechtes Auge<-->P
verhält sich ja wie das kleine strichlierte Dreieck

A / (x1+x2) = (h+z) / z

Umformen ergibt z = (x1 + x2) ( h + z ) / A

Du nimmst also einen bekannten Punkt und mißt
(h+z) = Augenebene <-> Punktebene
und X1 und X2 auf den Bildern davon

Durch Einsetzen kriegst du dann ein für alle Mal z raus

Das bleibt ja immer gleich, so wie A

Und dann kannst du die ganzen gleichungen aufdröseln.

EDIT Bitte beim Anwenden immer sicherheitshalber mitdenken, vielleicht hab' ich auch mal irgendein Vorzeichen vernudelt.

MrNiemand
18.07.2006, 18:22
die Formel hatte ich auch raus, nach umformen von deiner, aber bei verschiedenen eingesetzten Werten hatte ich eben immer unterschiedliche Werte für z.

Z wird mit sinkender Entfernung immer kleiner, bzw negativ.

PicNick
18.07.2006, 18:35
mmmhhh. DIe Sache ist eigentlich recht zwingend. Jetzt kenn' ich deine Laborbedingungen aber nicht ? Machst du das mit Web-Cam oder so ?

Den Punkt einmal direkt auf die, dann auf die anderen Augen-blickachse legen, damit die X-en abwechselnd mal null sind ?

MrNiemand
18.07.2006, 18:38
mit einer Digicam auf 2 festgelegten Positionen, das mit den X auf 0 wäre ziemlich aufwendig, aber Z geht von 40 bis -4 bei 1m distanz bis 50cm

PicNick
18.07.2006, 18:46
Das ist schon seltsam. Aber die Ausrichtung und das pixelzählen ist schon recht heikel, wenn z und x im Vergleich zu h klein sind.
Ich hab das damals so gemacht, daß die Kamera gleichzeitig durch zwei
versetzte spiegel geschaut hat, also zwei Halbbilder in einem.
Ich werd mal versuchen, das aufzuzeichnen

MrNiemand
18.07.2006, 20:37
aber wenn X2 < X1 also z.b. X2=-5 und X1=4 dann funzt die formel ja nichmehr?

18.07.2006, 21:40
Funktioniert die Formel eigentlich auch noch, wenn das Messobjekt links von der linken Kamera ist?

PicNick
19.07.2006, 06:54
Morgen ! Der Vorteil von dem Zeugs ist, daß man es auch aufzeichnen kann und sieht, was geht und was nicht.

Wollt nur sagen, bei den ersten Versuchen hab ich nicht die Positionen gewechselt, sondern zwei Objekte im Augenabstand aufgestellt und nur ein Bild gemacht. (dicke Edding-Faserschreiber senkrecht aufgestellt)

gast1234
19.07.2006, 09:32
Hallo,

für eine achsparallele Stereogeometrie, also nicht wie die Augen, besteht folgender Zusammenhang.

Zuerst definiere ich mir die Disparität d = x1 -x2, also die Verschiebung der Abbildungen x1 und x2 des 3DPunktes M in den unterschiedlichen Ansichten BildL und BildR.
b soll hier die Breite eines CCD Elements deiner Kamera sein und z die Brennweite.

(h+z)/z = a/(d * b)

(h+z) = a*z/(d * b)

Gruß
Gast1234

MrNiemand
19.07.2006, 17:57
Also, Picnick, war nochmal fleißig, deine Formeln funkioniere logischweise nur mit dem Betrag von X1 und X2.

Hier mal meine Lösung mit vorzeichenrichtigen Werten für X1 und X2:
b=arctan(x1/z)
c=arctan(x2/z)

h+z=((sin (90-b))*a*(sin (90+c))) / (sin(b+c))

ich weis ich war großzügig mit Klammern, aber so ist es finde ich verständlicher.

Über ein paar Versuche von euch mit diversen Positionen des Messpunktes wäre ich sehr glücklich, nicht das ich was vergessen habe.

PicNick
19.07.2006, 18:29
Na, werden wir morgen mal nachdenken/-rechnen, da hab' ich mehr Zeit.
Das kriegen wir schon hin.

Aber die ganze Sache wird ja erst lustig, wenn man die X-en aus den Bildern rausrechnen muß. Da war ich auch erst ganz am Anfang. Denn gar so deutlich ist das bei realen Bildern nicht mit den Kanten. Da braucht man eine richtige Strategie, um sich nicht totzurechnen, denk ich.
Schau'n wir halt.


PS: Nur zu, Klammer ist immer gut.

MrNiemand
19.07.2006, 19:00
Aber was ich nich gebacken bekomme, die Formel(n) so umstellen das ich Z berechnen kann.

MrNiemand
23.07.2006, 22:47
sagmal PicNick, haste dir meine Formel schon angekuckt????

PicNick
24.07.2006, 12:15
Hallo,
Du kannst es mit dem Sinus-satz rechnen, und da scheint mir deine Formel richtig zu sein. Ist ja auch logo.
Persönlich würde ich aber die Winkelfunktionen vermeiden wollen, da sie doch eine Menge rechnerei für den Computer darstellt.
In der Zeichnung oben hatte ich
P1 / (h+z) = X1 / z und P2 / (h+z) ) = x2 / z
umformung
P1 * z / X1 = h + z und P2 * z / X2 = h + z
also
P1 * z / X1 = P2 * z / X2 Jetzt ist aber P2 = a - P1, eingesetzt dann
P1 * z / X1 = (a-P1) * z / X2 -->
P1 * z * X2 = a * z * X1 - P1 * z * X2 -->
P1 * Z * X2 + P1 * Z * X1 = a * Z * X1 -->
a * X1 / ( X2 + X1) = P1
setz ich das oben ein
( a * X1 / (X2 + X1) ) * z / X1 = h + z -->

( a * z ) / (x2 + x1) ) = h + z

Man kann sich auch mit der "disparität" vom @Gast1234 arrangieren, wenn man die X-en mit gleichem Vorzeichen festlegt, also z.B. von der Mitte nach rechts --> Positiv
dann hiesse das ja
( a * z ) / (x2 - x1) ) = h + z

Und wenn wir noch berücksichten, daß wir ja noch keine Dimension haben (X-en sind ja vermutlich Pixelwerte und keine Zentimenter) Haben wir noch eine Umrechnung um das Verhältnis b = Länge / Pixel

MrNiemand
24.07.2006, 15:02
Hallo,
ja es mag sein das es mit Winkeln aufwendiger ist, aber es geht ohne ändern auch mit negativen X1 und X2 Werten, und die Lösung ist von vornherein eindeutig.

Mittlerweile habe ich auch die einfachere Formel zur Berechnung von x (also die verschiebung links oder rechts) zur Kamera.
Aber momentan fehlt mir irgendwie noch die Idee für Y also die Objekthöhe relativ zur Kamerahöhe.

Denn da es besser funktioniert, als ich anfangs dachte, hab ich mir schonmal ne kleine Software angefangen :P

PicNick
24.07.2006, 15:27
Ok, funktionieren ist die Hauptsache.

Höhe: Das ist doch dasselbe , nur von der Seite
z ist da,
h + z inzwischen ja auch
y ist der Abstand von der waagrechten Bildmitte am Foto
Y Objekt offset vertikal

y / z = Y / (h+z)

Y = y ( h + z ) / z

MrNiemand
24.07.2006, 16:52
könntest du es mir evl auch mal in ne kleine Skizze verpacken? dann kann ich wieder die allgemein gültige Formel daraus bilden

PicNick
24.07.2006, 18:10
Das ist die Ansicht von der Seite

MrNiemand
26.07.2006, 18:34
So ich habe mal alle meine Versionen der Formeln zu den Skizzen in ne Excel File verpackt, hat jemand Interesse? (benötigt keine Fallunterscheidung und gibt das Ergebnis bei vorzeichenrichtiger Angabe der Konstanten ebenfalls vorzeichenrichtig aus.)

PicNick
26.07.2006, 19:05
Na, her damit ! :-)

MrNiemand
26.07.2006, 19:18
ohne Worte, und viel Spaß damit

PicNick
26.07.2006, 19:25
Schau schau, danke. Gibt es Vergleiche berechnet/gemessen ?

MrNiemand
26.07.2006, 19:42
naja bei einigen Tests funktionierte es so Pi mal Schnauze, genau kann ichs aber noch nicht sagen, da ich erst 2 Kameras benötige um so Y Fehler usw zu eliminieren. Bei einer Kamera mit der ich zwei verschiedene Bilder, die immer leichte Fehler erzeugen.

27.07.2006, 15:30
Aber ich hab vorhin gesehen, du hast schon ne fertig montierte Optik, kannste nicht mal nen Testaufbau machen?

MrNiemand
27.07.2006, 15:46
der letzte Post war von mir, war nich eingeloggt!

PicNick
27.07.2006, 15:46
BIn jetzt nicht ganz sicher, wer mit wem redet ?
Ich selbst habe mehrere Versuchsaufbauten probiert. Mein Ziel ist es, beide Bilder in eine Kamera zu kriegen, um möglichst gleiche Verhältnisse zu haben. Also mit Spiegeln. Ich hab das aber zurückgestellt, weil sich als das eigentliche Problem rausstellte, gleiche Kanten auch als solche zu identifzieren. Und es ist ungeklärt, wie das bei einer schrägen Wand OHNE deutliche Kanten funktionieren kann.

Für Meßversuche empfehle ich immer noch, eine Kamera stehen zu lassen und dafür das Objekt um den Augenabstand versetzt zweimal aufzunehmen.
Da sind aber keine Überraschungen zu erwarten, denn theoretisch ist ja alles klar.

MrNiemand
27.07.2006, 15:59
Ich habe mir dir geredet, war eben nur nicht eingeloggt.

Hast du evl ICQ zum weiterlabern, denn scheinbar interessiert es sonst ja keinen.
Ohne 2 Kameras fest aufgebaut, macht es für mich nur bedingt Sinn, da die Ausrichtung so niemals wirklich exakt ist.

Aber du hast doch auf deiner Homepage ein Bild von exakt einem solchen Aufbau gepostet? Haste da nicht ein paar Testbilder?

Mit dem Kanten wiederfinden, habe ich schon ein bisschen gespielt, aber da mir eben momentan noch exakte Testbilder fehlen, muss ich es sehr umständlich auswerten. Wenn ich keine Fehler mehr für Y Werte in den Bildern bekomme, geht es viel einfacher.

Und da ich Anfangs ja nur an der Theorie interessiert war, habe ich noch keine Cams, bräuchte eben 2 USB Webcams für Linux.

PicNick
27.07.2006, 16:08
Ah, jetzt weiß ich.
Die Stereokamera auf dem Marsrover war nicht zur Messung, sondern die Bilder wurden übers Netz übermittelt zum Gucken mit Stereo Head-set.
Das kann jeder.

Muß auch schauen, hab einen Artikel gehabt über die Problematik, vielleicht find' ich den

ICQ hab' ich leider nicht.
Ich muß jetzt weg, ich schau dann nochmals rein

MrNiemand
27.07.2006, 16:10
Öhm, aber du kannst doch dann mir den Link geben, oder einfach ein paar Bilder davon schicken oder so????

marvin42x
27.07.2006, 16:27
@MrNiemand:
ich hätte da ein Update für Dich anzubieten.
Unten rechts auf der Seite findest Du 6 Symbole.
Das 2. von Links ist ein Kreis mit einem Punkt in der Mitte.
Wenn Du mit der Maus drüber stehen bleibst erscheint ein Text:
„Zeige Benutzer die diesen Thread gesehen haben“
Dieses Symbol anklicken und es erscheint eine Liste aller User die diesen Thread gesehen haben.
So, und jetzt die Kür:
Dicht links neben besagten Symbolen findest Du zwei Auswahlfelder:
Das Feld „Benutzername“ setzt Du auf „Zuletzt gesehen“
Das Feld „Aufsteigend“ setzt Du auf „Absteigend“
Dann drückst du den Knopf sortieren.
Und schon ist Dein Bewusstsein zum Thema „Interessiert ja doch keinen“ erweitert.
Zusätzlich bist Du auf dem neuesten Stand der Dinge.

Diese Information ist Kostenfrei.

Ich z.B. finde euer Thema sauspannend zu mal es auf einem nachvollziehbaren Level abläuft.

Wenn Ihr hier nicht weitermacht schicke ich euch die Vogonen auf den Hals.

Netter Gruß

MrNiemand
27.07.2006, 16:58
Ok es interessiert scheinbar doch jemand, wieder was gelernt (die Funktion kannte ich nicht),tausend Dank ;)

Dann finde ich es aber schade, das keiner mal seinen Senf zur Excel File von mir oder zu meinen Formeln abgibt, ob alles stimmt usw.

marvin42x
27.07.2006, 18:29
@MrNiemand:
Du hast gerade PicNick als Gesprächspartner, das reicht fürs erste, denke ich.
Interessante Threads können recht lang werden.
Solange ich nichts Essentielles beitragen kann schreib ich nichts dazu.
Ob ich mitlese weist Du ja sowieso ;-)
Ich weis aus Erfahrung, dass ganz viele Forumsmitglieder so handeln.
Ich weis natürlich auch, dass ab und an eine Interessenbekundung dem Thread auch gut tut.

Der Trend geht zum schlanken Thread

Netter Gruß
Und weiter so

PicNick
27.07.2006, 18:33
@MrNiemand: Täusch' dich nur nicht Deine Excel File wird genau gescheckt, und wenn ein Fehler drin' ist, bist du der Erste, der's erfährt :-Du mußt einem alten Herrn nur etwas Zeit geben.

Versuch mal
Robert / JFanatiker schnecken-nudel gmx-at
Der war vom TGM der Projektleiter für den Marsrover

frag' ihn, ob's von dem Rover noch Spuren gibt.

(Die Burschen sind ja nach dem Diplom in alle Winde zerstoben)

MrNiemand
27.07.2006, 22:29
dann ist ja gut ;)

Ich bilde mir eh gerade ein, das die 10ner Potenzen ein bisschen verquer sind, würde mich freuen wennste selbst mal ein paar Testmessungen machen könntest.

zefram
29.07.2006, 08:34
Hallo,

wer sich nicht scheut mit Matritzen zu rechnen, kann die 3D Koordinaten auch mit folgender Matrixmultiplikation ausrechnen:


Gegeben sei (u,v) die Koordinaten des Punktes im linken Bild. Weiterhin kennen wir d, die schon angesprochene Disparität (Unterschied in den x-Koordinaten zwischen linkem und rechtem Bild). B sei der Abstand der Kameras zu einander. px ist die halbe Bildbreite, py die halbe Bildhöhe. f ist die Brennweite der Kamera.

Dann gilt folgende Formel:

http://www-user.tu-chemnitz.de/~niko/studienarbeit/img71.gif[

Nun müssen wir noch X, Y und Z jeweils durch s teilen, um die gesuchten 3D-Koordinaten zu erhalten.

Obige Formel (und auch die bisher angegebenen) gilt nur, wenn die beiden Bildebenen in einer Ebene liegen, also nicht "schielen", nicht verschoben sind und keine Verzerrungen wegen Linsenkrümmungen etc. auftreten. Ohne Kalibrierung der Kameras wird man da keine sehr genauen Ergebnisse erhalten.

zefram
29.07.2006, 08:40
Die Stereokamera auf dem Marsrover war nicht zur Messung, sondern die Bilder wurden übers Netz übermittelt zum Gucken mit Stereo Head-set.


Ganz so war es nicht. Die Bilder wurden zwar auch wie von dir beschrieben verwendet um die nächsten Meter der Bewegung von Menschen planen zu lassen, aber auch um die Eigenenbewegung der Roboter zu berechnen. Diese Berechnung der Eigenbewegung anhand der Daten einer Stereokamera nennt man "Stereo-Odometrie". Auf beiden Robotern wurde diese Technik sehr wichtig, da beide in Terrain mit losem Sand gerieten und die Räder am durchdrehen waren. Die Messungen der Odometrie über Radencoder war also völlig falsch. Mit Hilfe der Stereo-Odometrie konnte die korrekte Bewegung automatisch ermittelt werden.

Wen das interessiert, der kann sich folgende Veröffentlichung von Larry Matthies vornehmen: http://www-robotics.jpl.nasa.gov/publications/Mark_Maimone/smc05_cheng_maimone_matthies.pdf

MrNiemand
29.07.2006, 09:09
Öha, danke für die Formel!
Mit Matrizen hab ich ja schon ewig nicht mehr gerechnet (muss mir erstmal wieder überlegne, wie mann das noch gleich macht)

PicNick
29.07.2006, 13:14
Ganz so war es nicht.
Es gibt mehrere Marsrover. Ich red' von einem Diplomprojekt des TGM in Wien.

zefram
29.07.2006, 16:19
Ganz so war es nicht.
Es gibt mehrere Marsrover. Ich red' von einem Diplomprojekt des TGM in Wien.

Achso sorry.

Wusste garnicht, dass Österreich auch schon einen Roboter auf dem Mars hat ;)

PicNick
29.07.2006, 16:42
Is ja kein Problem. Inzwischen sagt man zu allem, was sich in so einem Terrain bewegen soll, "Marsrover" :-)

https://www.roboternetz.de/phpBB2/viewtopic.php?t=11313

MrNiemand
07.08.2006, 14:33
Sodalein, hat jemand mittlerweile schon mal jemand mein Excel File durchgeckuckt?

Mein empfangen der Bilder von meiner USB Webcam aufm Bot steht mittlerweile (die Woche kann ich die 2te abholen)

Nun würden mich mal Vorschläge interessieren, zum Thema "Bei welchen Punkten macht es überhaupt Sinn diesen im anderen Bild zu suchen?"

Bei einer Kante reichen mir ja im Prinzip die Eckpunkte, aber wie kann ich am effektivsten feststellen, ob ein anderer Punkt noch auf der Kante liegt und deshalb ignoriert werden kann oder nicht?
Oder anderes gesagt, wie kann ich Pixel als die Endpunkte einer Kante identifizieren?

zefram
08.08.2006, 21:59
Schau dir mal den Harris Corner Detector an.

MrNiemand
03.12.2006, 19:40
also es gibt mal News, mittlerweile kann ich die 3D Koordinaten eines Balles (mit annähernd beliebigem Durchmesser) recht erfolgreich berechnen.

skillii
05.01.2007, 23:09
Wie hast du das hingekriegt, dass du den Ball in dem Bild findest?

MrNiemand
06.01.2007, 10:07
ich geh einfach durch das Bild, berechne die Differenz des aktuellen Pixels zu den umliegenden => ich hab ne Art Richtung für jeden Pixel, dann geh ich von den Pixeln die als Richtung 45° bzw 135° haben solange in dessen Richtung weiter, bis das entsprechende Pixel in Gegenrichtung kommt.

Daraus erhalte ich dann ein paar Schnittpunkte, die noch bissle zusammenfassen zu einem, und schon ist es getan.

skillii
06.01.2007, 17:00
Das mit der "Richtung für jeden Pixel" habe ich nicht ganz verstanden...

Findet man Beschreibungen für solche Algorithmen im Internet???
Habe dazu nicht wirklich viel gefunden ... nach was sucht man da am Besten?
Korrelation???

MrNiemand
06.01.2007, 17:56
ich meine damit, ob die Kante, in der der Pixel vorkommt, nach links, rechts usw zeigt

Nö, war ne Spinnerei von mir.
ka nach was man da suchen könnte?

michiE
06.01.2007, 18:15
ic hhabe im moment enorme probleme damit einen roten ball auf einem parketboden zu erkennen .

ich habs inzwischen geschafft mit den formeln die entfernung eines punktes auf zwei , in paint nachbearbeiteten bilden zu berechnen , scheint zu funktionieren ... nur in der realität wills noch nciht so ;)

mfg
Michi