Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Dreidimensionale Bildinterpretation/Trigonometrie
Sebastian_
20.07.2005, 16:39
Hallo
Bin hier schon seit einiger Zeit als Leser unterwegs, habe allerdings jetzt auch mal eine Frage :)
Ich bastele momentan an einem kleinen Programm, das aus 2D-Bildern 3D-Informationen gewinnen soll. Dazu habe ich mir einen Zwei-Kamera-Aufbau zusammengeschraubt, mit einem festen Abstand c der Kameras sowie beide montiert in einem 90°-Winkel zu c (Montageschiene).
Da Trigonometrie bei mir in der Schule erst nächstes Jahr kommt, frage ich einfach mal:
1. Wäre es vorteilhafter, die Kameras in einem stumpfen Winkel (bspw. 100°) zu montieren?
2. Das Korrespondenzproblem habe ich bereits mit für mich zufriedenstellender Genauigkeit gelöst, d.h. ich finde die zwei Bildpunkte (-pixel) in den 2 Bildern, die zusammengehören. Gegeben sind also auch deren xy-Koordinaten in den zwei Einzelbildern. (Wobei die y-Koordinate eigentlich gleich sein sollte, oder liege ich da falsch?)
Aber wie kann ich daraus nun die die Entfernung zu c bzw. die Höhe h_c berechnen?
Sebastian
Mercator
20.07.2005, 18:34
Also wenn ich das richtig verstanden habe, dann sollte das so aussehen, wie im Anhang, richtig?
Um die Entfernung von Punkt P zu c (also h) zu bekommen musst du aber a oder b wissen. Dann gilt, wenn du a kennst: sin (beta) = h/a. Wenn du b kennst: sin (beta) = h/b.
Sebastian_
20.07.2005, 19:18
Ja, genau so sieht es aus. Darf ich fragen, mit welcher Software du die Konstruktion erstellt hast? (Habe GeoGebra, aber das ist etwas umständlich)
Danke für die Formel, das verschiebt allerdings mein Problem nur etwas: Wie a respektive b bestimmen?
Sebastian
Häufig hat man in solchen Fällen doch c, alpha und beta.
Dann könnte man es doch mit dem Sinussatz versuchen.
Manfred
http://www.mathewissen.de/klasse10/sinus.php
Ein Tip zum leichter rechnen:
Hab jetzt kein Zeichenprogramm, versuche es zu beschreiben, und beziehe mich auf die tolle Zeichnung von Mercator (danke).
drei parallele Ebenen:
1 Augenebene c durch K1 / K2,
2 Objektebene durch P
3 Bildebene UNTER c abstand Brennweite (bekannt)
2 x Augenachsen in K1 und K2 (nicht schielen, gerade nach vorn),
schneiden alle drei ebenen im rechten winkel
P1 , P2 Abstand P von den Schnittpunkten Augenachse u. Objektebene
jetzt bildet P
in der verlängerung von a eine Abbildung auf der Bildebene mit abstand x1 von der augenachse (das sind dann Pixel als abstand von der Mitte)
in der verlängerung von b eine Abbildung auf der Bildebene mit abstand x2 von der augenachse
Du hast jetzt ein paar ähnliche dreiecke
x1 / Brennweite = P1 / h
x2 / Brennweite = P2 / h
P1 + P2 = Augenabstand
daraus kannst du mit normalen Rechenarten h (objektabstand) leicht berechnen
Wenn du dir das aufzeichnest, kannst du es sicher nachvollziehen
Sebastian_
20.07.2005, 19:45
Danke Dir für den Link.
Ich scheitere aber daran, dass ich zwar die Winkel habe, in denen die Cams montiert sind, aber nicht die zwischen c und Punkt P. Wie könnte ich an die rankommen?
Sebastian
Ah ja, vergessen
P1 / P2 = x1 / x2
Falls es um den Winkel gamma geht, die Summe der Winkel im Dreieck sind 180°.
Ich hoffe wir kriegen das wieder auseinander.
Falls die Abbildungsfehler stark in Erscheinung treten, ist es auch zu überlegen, die Pixel zu zählen und die Entferngen in Tabellen nachzusehen.
Manfred
_Sebastian_
20.07.2005, 21:05
So, habe aus deiner Anleitung mal was zusammenskizziert, PicNic :)
Mir ist allerdings unklar, wie du das meinst:
"jetzt bildet P
in der verlängerung von a eine Abbildung auf der Bildebene mit abstand x1 von der augenachse (das sind dann Pixel als abstand von der Mitte)
in der verlängerung von b eine Abbildung auf der Bildebene mit abstand x2 von der augenachse "
Du hast P als Benennung zweimal verwendet, einmal für [P1P2] und einmal für den Punkt P auf der Objektebene.
Ist das png ungefähr so, wie du es dir gedacht hast?
Sebastian
BTW: Wäre eine Berechnung mittels Trigonometrie nicht etwas einfacher? (und schneller)
Nein, so wie Mercator gezeichnet hat. Diese drei Ebenen sind dann nur striche, ich versuchs. Draufsicht:
......|----p1----P----p2-----|
......|----------------------|
......|----------------------|
......|----------------------|
......|----------------------|
......K1----------c---------K2
......|----------------------|
..x1..|---------Bild---------|....x2
Die Verbindungen a, b sind nicht eingezeichnet
P--K1--x1
P--K2--X2
K1<->K2 Augenabstand = p1 + p2
Dadurch entstehen ähnliche Dreiecke
Winkelfunktionen dadurch nicht notwendig.
Der Komputer tut sich leichter nur dividieren und multplizieren.
Und die Abstände x1, x2 sind ja direkte Pixel anzahlen
X1 verhält sich zu x2 wie P1 zu P2
P1 durch Objektabstand h verhält sich wie x1 zur brennweite
Edit: mich gibt's erst morgen wieder , bis dann !
Mercator
20.07.2005, 23:27
Ja, genau so sieht es aus. Darf ich fragen, mit welcher Software du die Konstruktion erstellt hast? (Habe GeoGebra, aber das ist etwas umständlich)
Die Zeichnung habe ich in Flash 5 gemacht..... Aber jedes andere Zeichenprogramm tuts wahrscheinlich auch.
_Sebastian_
21.07.2005, 12:01
So sieht das schon nützlicher aus :)
Was mir allerdings nicht klar ist: Was meinst du mit "x1 x2 sind Pixelanzahlen"? Wie soll ich x1 und x2 herausbekommen?
https://www.roboternetz.de/phpBB2/files/construct.png
Schönes Bild, wenn man am rechten Rand noch ein paar weiße Pixel wegläßt und horizontal unter 800 bleibt, dann passt es ins Seitenformat.
Manfred
Super ! Genauso.
müßte man noch sagen K1 <---> K2 ist die "Augendistanz", sagen wir "A"
und der Abstand Bildebene <-->Augenebene ist die Brennweite, sagen wir "Z" (= Abstand Linse<>Bild)
Pixel: Das ist so gemeint: Wenn ich zwei Bilder habe, eines bei x1, eines bei x2 (auf der Bildebene) bekomme ich (im Komputer) den Wert von x1/2 jeweils als pixeldistanz zur Bildmitte. Auf einen Foto kann man x1/2 natürlich auch in millimetern messen.
Ich hab nochmal nachgedacht und die beste Vorstellung kriegst du folgendermaßen:
Wenn du zu der Geraden b im Punkt K2 eine parallele zeichnest, bekommst du bei K2 das gleiche dreieck wie bei K1 , x1
Und nun gilt:
(x1 + x2) verhält sich zu "Z" , wie "A" zu "h"
Bei bekannten x1/2 , "Z" und "A" kann man also "h", den objektabstand, direkt ausrechnen.
Um "Z" und die dimension von x1/2 zu bestimmen, ist es am einfachsten, einmal ein Objekt mit BEKANNTEM "h" aufzunehmen und so die Werte rückzurechnen.
Anschaulich überprüfen läßt sich das, wenn du "P" einmal links und einmal rechts genau in die Augenlinie stellst , Dann ist einmal x1 = 0, dann x2 = 0.
Es ist auch erkennbar, daß "h" nicht null und auch nicht unendlich werden darf
Natürlich geht es auch mit Winkelfunktionen und normalen Dreiecksätzen. aber der Computer braucht länger, das dann zu rechnen (Ich hab' das damals für realtime gebraucht, da kriegst du 15 Bilder in der Sekunde, das dampft dann ganz schön)
_Sebastian_
21.07.2005, 13:57
Die Strahlensatzfigur ist mir jetzt klar. Danke für die gute Erläuterung :)
Wie bist du da eigentlich drauf gekommen?
[...] bekomme ich (im Komputer) den Wert von x1/2 jeweils als pixeldistanz [millimeter] zur Bildmitte.
Also wäre 0,5x1 = Strecke von Bildmitte zu gefundenem Punkt (Pixel) in Bild 1 der K1, und dementsprechend 0,5x2 = Strecke von Bildmitte zu korrespondierendem Pixel in Bild 2 der K2?
15 Bilder/s ist wirklich ordentlich, hast du das Ganze in ASM implementiert?
Manf, bei mir passt es ins Seitenlayout. Das Dumme an meinem Konstruktionsprogramm ist, dass sich die Größe der Beschriftung nicht verändern lässt. Verkleinere ich es also zu stark, kann man zwar die Konstruktion noch gut erkennen, aber nichts mehr lesen. :/
Edit: habe den Rand abgeschnitten. Besser so?
Bei einem Capture-device (WebCam) krieg ich die Bilder als BMP Zeile für Zeile, Pixel für Pixel, Asche zu Asche.
Da fahr ich nun (pixelweise) durch und krieg logo x-Werte . zB
320 x 240 Bild
0 <= x < 320 mitte bei 160, klaro
Da kein Schwein die Brennweite der Webcam kennt, mußte ich natürlich wie beschrieben erstmal rückrechnen.
Noch eine Erklärung: Ich hab keine Stereocam, also hab ich mit Spiegeln zwei Bilder in eine Kamera nebeneinander reingestopft. Im dem einen Bild arbeite ich dann mit zwei pointern fürs linke und rechte Bild
Das geht auch in C++ ganz flutschi. Das wirkliche Problem ist es, gleiche Punkte in den zwei Bildern erstmal zu bestimmen. (Man kriegt ja drei Farben je Punkt, mit Helligkeit ist es da nicht so einfach)
UND die Bilder rauschen ganzschön, wenn sie live sind. bei Standbildern ist das etws leichter.
Sonst alles paletti ?
Ah ja, unterm H.. ausgeloggt. Der Gast war ich, für sowas steh' ich 'grade.
Edit: habe den Rand abgeschnitten. Besser so?
Vielen Dank, ich kaufe mir auch bald mal einen größeren Bildschirm.
Manfred
_Sebastian_
21.07.2005, 16:09
Einfach ist die Bestimmung der gleichen Pixel nicht. Ich habe das in ASM gelöst, ersteinmal natürlich durch Farbwertvergleich, dann durch Vergleiche der umgebenden Pixel und 2D-Objekterkennung, also Umrisse um erkennbare Objekte gezeichnet, das kann man gut verwenden, wenn man viele homogene Flächen im Bild hat, Tisch, Wand z.B. Funktioniert ganz gut :)
Ich habe mir testweise 2 hochauflösende Bilder mit meiner DigiCam gemacht. Der Augenabstand beträgt exakt 150mm, die Höhe etwa 800mm. Rechne ich zurück, kommt allerdings eine unmöglich hohe Brennweite heraus. (die Cam hat 6-18mm Brennweite [nicht umgerechnet auf Kleinbildformat, realer Wert]). Irgendwas mache ich noch falsch.
Wäre in der Zeichnung 0,5x1 die Strecke [M2 P2], also => x=4?
Ich hab leider "Brennweite" gesagt, dabei ist der Ausdruck eigentlich falsch. Gemeint ist der abstand Bild / Linse
Das (reale) Bild entsteht ja "hinter" dem Brennpunkt. Mein Optik-Unterricht ist schon ein paar Wochen her, da müßt ich echt nachschauen, gibt's einfache Formeln.
Ich hab es damals sinnlos gefunden, mit Millimetern Brennweite auf Meter Entfernung umzurechnen, und daher die gemessene Entfernung Bildmitte / Object einfach als Zahl genommen. Wenn ich ein Lineal von einem Meter im Abstand zwei Meter aufgenommen haben, waren das ganz einfach irgendwelche bestimmten Millimeter am Schirm oder Pixel oder sonstwas.
Und wenn ich einen senkrechten Stab in einem Meter entfernung aufgenommen habe, dann hat der ganz einfach eine bestimmte differenz x1/x2 ergeben.
Dadurch haben mich die genauen Eigenschaften der Kamera eigentlich garnicht wirklich interessiert, da es ja nur um die DIFFERENZ x1 / X2 und den Augenabstand geht.
Ist mir klar, jeder wirklich Optiker bringt mich wahrscheinlich sofort um.
Aufpassen auf die Vorzeichen von X1 u. X2 , nur wenn das Object zwischen den Augen ist, isses so, wie gezeichnet.
_Sebastian_
21.07.2005, 17:09
achsoooo, du meinst den Auszug. ](*,)
Jetzt hast du es geschafft, mich *etwas* zu verwirren :)
Bei den zwei Punkten m (Mittelpunkt des Bildes) und p ist x also dann _immer_: x-Koordinate des "weiter rechten" Punktes - x-Koordinate des "weiter linken" Punktes?
Links oder rechts von der Mitte.
_Sebastian_
21.07.2005, 17:26
Also erhalte ich das jeweilige x auf dem Wege, wie zwei Posts vorher beschrieben?
Wie gesagt, ganz praktisch:
am linken bild ist links von der mitte +,
am rechten bild ist rechts von der mitte +,
Warum:
ist der Punkt P genau zwischen den Augen, ist dann x1 = x2
und die Rechnung paßt
(x1 + x2) verhält sich zu "Z" , wie "A" zu "h"
ist der Punkt P rechts von beiden Augen, ist dann wird x2 negativ
und die Rechnung paßt wieder
(x1 + (-x2)) verhält sich zu "Z" , wie "A" zu "h"
Edit: Dadurch ist der positive wert auch immer größer als der negative, es können also keine negativen entfernungen rauskommen
Hattet ihr schon Zentralprojektion ? da findest du vielleich eher Ähnlichkeiten mit dem Schulstoff
_Sebastian_
21.07.2005, 17:51
Wenn ich so vorgehe, dann gilt aber bei mir:
Sowohl x1 als auch x2 negativ:
In Bild 1 ist der Punkt rechts von der Mitte => -
In Bild 2 ist der Punkt links von der Mitte => -
Dementsprechend wäre dann x1 + x2 negativ - obwohl das, wie du ja geschrieben hast, nicht sein dürfte.
Wie gibt's das?
_Sebastian_
21.07.2005, 17:55
Ich kenne Strahlensatz, Ähnlichkeiten, Optik (halt nur Stoff der Neunten). Lochkamera und solche Dinge sind behandelt. Das hier ist von der Geometrie her also bereits da. Ich habe aber ernsthafte Probleme, mir das physisch vorzustellen - deswegen wahrscheinlich auch die vielen Fragen :)
Ich bin absolut überzeugt, daß wir da nur herrlich aneinander vorbeireden, du bist ja offensichtlich ein blitzgescheiter Bursche.
Laß es mal einsickern, ich versuch mich inzwischen mit einem Zeichenprogramm, um das zeugs halbwegs anschaulich darzustellen.
Für heute war's das, mein Weib ruft !
Morgen !
Habe mich erwürgt mit Powerpoint, Die Attachments leider in falscher Reihenfolge, sei's drum.
Test1a.gif:
Zentralprojektion von oben, ist, glaub' ich, klar.
Die "Bildebene" ist nun ZWISCHEN Augen und Object.
Test1b.gif:
die Verbindung P <> linkes auge parallel verschoben. dadurch zwei ähnliche Dreiecke
Und nun gilt:
--> a / (h + z ) = (x1 + x2 ) / z
--> ( a * z ) / (x1 + x2 ) = h + z
--> h = z + ( a * z ) / (x1 + x2 )
(das mit den x-Vorzeichen ist nun wieder umgekehrt, aber ich denk, die Zeichnungen sind verständlich
_Sebastian_
22.07.2005, 12:55
Hallo
Danke für die Mühe :) (wie kann man sich eigentlich der Folter unterwerfen, in PP zu konstruieren?)
Es müsste nun also gelten: Punkt rechts der Mitte im linken Bild +, Punkt links der Mitte im linken Bild - sowie Punkt links der Mitte im rechten Bild +, Punkt rechts der Mitte im rechten Bild -
Liege ich da richtig?
Kennst du eigentlich den Begriff der Disparität? Habe in zwei Diplomarbeiten über Stereogeometrie gestöbert. In einer wurde die Disparität d als x1 - x2 definiert und dann folgende Formel für die Z-Koordinate von P bzw. die Höhe aufgestellt: h = (z * a) / d.
Hier habe ich allerdings das Problem, dass, wenn ich die Vorzeichen von x1 und x2 nach obiger Regel bestimme und die Werte von x1 und x2 als Differenz der jeweiligen x-Werte des Punktes P und dem x-Wert des Mittelpunkts, für die Disparität je nach gewähltem Punkt auch negative Werte entstehen können, und das dürfte eigentlich nicht sein.
Ich muß ehrlich gestehen, ich hab zwar Abi (Matura), aber darüber hinaus bin ich fachlich ein absoluter Dödi. Ich hab halt ein paar Bücher gelesen und über manches nachgedacht, eben alles selbstgestrickt.
Ich bin sicher, für den von mir vorgeschlagenen Weg gibt es ein Menge Literatur, auch in altgriechisch, und Fachwörter, die ich nicht kenne. Ich hab das ja auch nicht wirklich erfunden.
Edit : Schwachsinn gestrichen
AUSSER das Objekt liegt hinter den Augen, dann ist das rechnerisch zwar auch ok, aber natürlich virtuell.
Probier einfach für "P" ein paar extrempositionen, du wirst sehen, es paßt
EDIT: Wie macht das der Kollege, wenn die differenz = 0 ?
Ausgebesserter Schwachsinn:
Der Ausdruck ( X1 + X2 ) ist bei den angegebenen Richtungen so, daß IMMER ein positiver Wert dabei rauskommt. beides negativ wär dann der "virtuelle" gegenstand hinten.
Nochwas : deine Interpretation meines Kunstwerkes war vollkommen richtig
Nocheins drauf: bei unendllicher Entfernung wird die Sache natürlich kritisch, da X1 UND X2 auf Null gehen. Das muß man im Programm abfangen.
_Sebastian_
22.07.2005, 13:52
Es funktioniert *jubel*. Jetzt muss ich nur noch meinen Aufbau genauer gestalten, momentan ist der noch arg ungenau (+-20mm)
Mit beiden Formeln, allerdings nur, wenn ich die Disparität als x1 + x2 definiere. Komisch
Bist mir aber nicht böse, wenn ich nicht deine nehme, sondern die aus der Diplomarbeit - weniger Rechenaufwand? :)
Zu dem Fall x1 - x2 = 0: Dazu wurde nichts geschrieben, der Autor ist wohl Optimist. Bei x1 + x2 sollte der Fall ja eigentlich nicht auftreten (oder?)
Und bzgl x1 + x2 umgekehrt proportional zur Entfernung: Ja, darauf ist der in seiner Arbeit auch eingegangen. Wie behandelst du das? Approximierst du einfach einen sehr hohen Wert h für die Entfernung des Punktes oder berechnest du den Punkt einfach nicht?
Lizenzen gibt's sowieso nicht :mrgreen:
Die Differenz wird in der Praxis meistens ein sehr kleiner Wert sein, ( weil ein objekt ja meist in der Mitte fixiert wird), bei ein Summe ist das egal. Nun.
Bei mir ist diese Stereometrie nur ein Teil der Wahrnehmung. Je weiter was weg ist, desto weniger ist es für den Roboter relevant, er kann sich ja nicht dran stoßen. Ab 4-5m verzicht ich dann drauf.
Es wäre dann eher wichtig, bei ZWEI Objecten zu wissen, was vorn und was hinten ist. Also, wenn du willst, die Differenz zwischen zwei verschiedenen Disparitäten. (schönes Wort = "Nicht Gleichkeiten")
Auch der Mensch bestimmt in eine gewissen Entfernung nicht mehr stereometrisch, sondern durch Größenvergleich. ( deswegen gibt's ja die optischen Täuschungen, und einäugige sind durchaus lebensfähig)
Kurzum: Bei einem Zielgerät für die Artillerie mußt du wohl rechnen, solange noch irgendeine Dezimale da ist. Aber beim allgemeinen Roboter reicht das Nahbereich.
Ich würde allgemein sagen, es hängt einfach von der Meßgenauigkeit für x ab.
Nicht genug: Sag , vielleicht rechnet der Kollege einfach die x-en immer von links und nicht von der Mitte, wie bei mir ? Dann ist ja seine Differenz gleich mit unserer Summe ?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.