2017-07-21 3 views
1

[1 0 0 0; 0 1 0 0; 0 0 1/f 0] [xyz 1] '= [xyz/f]' -> (f x/zf * y/z) = (u, v)Perspektive Projektion rückwärts

Dieser wandelt 3D-Punkte (x, y, z) zu Pixeln (u, v). Wie kann ich von Pixeln zu 3D-Punkten wechseln? Entschuldigung, ich bin nicht sehr schlau.

+0

Hallo und willkommen zu stapeln Überlauf! Bitte versuchen Sie eine schönere Formatierung in Ihrer Frage zu verwenden. Entschuldige dich auch nicht, dass du das nicht weißt. Diese Konzepte können manchmal für Neulinge rätselhaft sein, also keine Sorge. – Ash

Antwort

0

Leider verlieren Sie Tiefeninformationen, wenn Sie einen Punkt projizieren. So können Sie den ursprünglichen 3D-Punkt nur bis zur Skalierung wiederherstellen. Lassen Sie uns Ihre Umwandlung wie folgt umschreiben:

calib_mat=[f 0 0 ; 
      0 f 0 ; 
      0 0 1] 

Ich entfernte die letzte Spalte, da es keine Auswirkungen hat. Dann haben wir

calib_mat*[x y z]'==[fx fy z]=1/z * [fx/z fy/z 1]= 1/z * [u v 1]. 

Nun nehme an, Sie wissen [u v 1] und Sie den 3D-Punkt erholen. Aber jetzt wird die Tiefeninformation verloren, so was Sie wissen, ist

calib_mat * [xyz] '= (1/unknown_depth) * [uv 1]

, daher

[x y z]'=(1/unknown_depth)*inverse(calib_mat)*[u v 1] 

So Sie habe erhalten, was Sie wollten, aber maßstabsgetreu. Um die Tiefe des Punktes wiederherzustellen, benötigen Sie entweder mehrere (mindestens zwei) Ansichten des betreffenden Punkts (z. B. für die Triangluation). Wenn Sie sich nicht in einem Computer Vision-Kontext, sondern in einem Rendering-Kontext befinden, können Sie die Tiefe in einer Art von Z-Puffer speichern, wenn Sie den Punkt projizieren.

0

Wenn Sie dreidimensionalen Raum auf ein zweidimensionales Bild projizieren, verlieren Sie Informationen über die Tiefe, und es ist schwierig, die Tiefeninformationen über die Tiefe von nur einem Bild zu erhalten. Tiefeninformationen können jedoch wiedergewonnen werden, wenn Sie ein anderes Bild derselben Szene aus einem anderen Blickwinkel haben. Dein Gehirn macht etwas Ähnliches, um Tiefe zu verstehen, indem es die "Bilder" von deinen zwei Augen benutzt, um dir die Tiefe der Welt um dich herum zu erklären.

Die grundlegenden Prinzipien der Stereorekonstruktion lassen sich am besten auf diese Weise erklären: Halten Sie jedes Objekt in der Nähe Ihrer Augen und schließen Sie dann ein Auge. Dann öffne das Auge und schließe das andere. Dann mach das gleiche nochmal, aber bewege das Objekt weiter von deinen Augen entfernt. Sie werden feststellen, dass sich das Objekt viel mehr bewegt, wenn Sie das Auge wechseln, wenn sich das Objekt in Ihrer Nähe befindet, als wenn es weiter entfernt ist. Im Kontext von zwei Bildern wird die Menge (in Pixeln) eines einzelnen Merkmals auf einem Bild zwischen zwei Bildern derselben Szene als "Disparität" bezeichnet. Um die relative Tiefe der Szene zu berechnen, nehmen Sie einfach (1,0/Disparität). Um die absolute Tiefe der Szene (z. B. in Metern oder einer Maßeinheit) zu erhalten, werden die Brennweite und die Grundlinie (Abstand zwischen den beiden Kamerastandorten) benötigt (und Gleichungen dafür werden später erörtert).

Jetzt, da Sie wissen, wie die Tiefe jedes Pixels berechnet wird, müssen Sie nur noch die Features vergleichen, damit Sie die Disparität berechnen können. Wenn Sie jedes Pixel in Ihrem ersten Bild im zweiten Bild iterativ finden würden, würde es schnell unhandlich werden. Das "Suchproblem" wird jedoch durch die Tatsache vereinfacht, dass zwischen zwei beliebigen Bildern eine "Epipolarlinie" existiert, die die möglichen Positionen für ein Merkmal in Bild1, das in Bild2 erscheint, erheblich verringert. Der einfachste Weg, dies zu visualisieren, ist, an zwei Kameras zu denken, die so angeordnet sind, dass der einzige Unterschied zwischen der ersten und der zweiten Kamera darin besteht, dass die zweite Kamera horizontal von der ersten bewegt wurde (beide Kameras sind auf gleicher Höhe) gleiche Tiefe von der Szene entfernt). Intuitiv sagen wir, dass ein Ball in Bild 1 bei einem bestimmten Pixel (x1, y1) ist.Vorausgesetzt, dass die Kameras ein Bild des gleichen Balls in der gleichen Höhe aufgenommen haben, ist es intuitiv, dass, während die Pixelposition des Features in Bild1 des Balls möglicherweise nicht an der gleichen Stelle in Bild2 ist, dass mindestens Das gleiche Merkmal in Bild2 wird dasselbe y wie in Bild1 haben, da sie beide auf der gleichen Höhe aufgenommen wurden. In diesem Fall wäre die Epipolarlinie vollständig horizontal. Bei Kenntnis dieser epipolaren Linie muss man nicht mehr nach image2 nach dem Ort eines gefundenen Merkmals image1 suchen, sondern es muss nur die epipolare Linie durch den Ort des Merkmals in image1 in image2 gesucht werden. Während die Kameras nicht ohne Unterschied zwischen ihren Positionen nebeneinander platziert werden müssen, mit Ausnahme der horizontalen Translation, macht sie die Berechnung viel einfacher und intuitiver, da sonst die Epipolarlinie geneigt wäre. Um also Merkmal1 von Bild1 an Merkmal2 in Bild2 anzupassen, muss man einfach eine Merkmalvergleichstechnik verwenden (die normalisierte Kreuzkorrelation wird oft verwendet), um zu bestimmen, welche Position von Merkmal2 in Bild2 am wahrscheinlichsten ist. Bei gegebener übereinstimmender Position eines Merkmals in beiden Bildern kann die Disparität berechnet werden, indem die Größe zwischen den zwei Pixeln genommen wird.

Nach Übereinstimmung der Merkmale wird die Disparität des Pixels durch einige Gleichungen auf Seite 7 dieser lecture notes berechnet, wobei b die Basislinie zwischen den Kameras und l die Brennweite in der gewünschten Maßeinheit ist Verwenden Sie (z. B. Zoll, Meter usw.). Wenn Sie nur nach einer relativen dreidimensionalen Position der Pixel in dem Bild suchen und sich nicht um die Position der Pixel kümmern (dh ein Punkt links von einem Bild wird immer noch in der Rekonstruktion links liegen, und a Punkt weiter zurück in das Bild wird weiter zurück in der Rekonstruktion), können beliebige Werte ungleich Null für Brennweite und Grundlinie gewählt werden. Diese Notizen erklären auch etwas mehr Intuition, warum das funktioniert, wenn Sie noch neugierig sind.

Fühlen Sie sich frei, irgendwelche Fragen zu stellen, und es gibt keinen Grund, auf sich selbst zu sein - so oder so suchen Sie Wissen und das ist lobenswert.

+0

Das ist alles sehr nett und korrekt, also stimme ich nicht ab. Aber antworten die meisten Ihrer Antworten nicht vom Thema? Ich meine, du hast alles erklärt, außer was OP hinterher wollte. Nicht versuchen, unhöflich zu sein, nur zu sagen, dass Ihre Antwort wahrscheinlich ohne den langwierigen Exkurs über Intensitätsabgleich und so weiter besser wäre. – Ash

+0

@Ash seine Frage war im Wesentlichen nicht zu beantworten, eingerahmt in dem Kontext, den er gab, so dass ich dachte, ich würde eine vollständige Antwort geben, anstatt ihm die Ableitung der dreidimensionalen Linie, die durch jeden Pixel im Bild passiert. Wenn er erwähnte, dass er das machte, um einen ZBuffer oder so etwas zu schaffen, würde ich wissen, dass meine Antwort nicht das ist, wonach er suchte. Vielleicht fragte er nur, weil er neugierig war, ob eine reine "Umkehrung" zu einer perspektivischen Projektion existierte. In diesem Fall versuchte ich nur zu erklären, dass dies eine Methode ist, die ziemlich nah an dem ist, wonach er verlangte. – pete2fiddy