Kamerakalibrierung / Lochkameramodell und Ermittlung der 3D-Position

10

Ich habe eine kalibrierte Kamera und habe die intrinsischen Parameter. Ich habe auch die extrinsischen Parameter relativ zu einem Punkt (dem Weltursprung) auf einer planaren Oberfläche in der realen Welt. Diesen Punkt habe ich als Ursprung in der realen Welt Koordinaten [0,0,0] mit einer Normalen von [0,0,1] gesetzt.

Aus diesen extrinsischen Parametern kann ich hier die Kameraposition und -rotation in den 3D-Koordinaten der Weltebene ermitteln: http://en.wikipedia.org/wiki/Camera_resectioning

Jetzt habe ich einen zweiten Punkt, an dem ich die Bildkoordinaten für [x, y] extrahiert habe. Wie erhalte ich jetzt die 3D-Position dieses Punktes im Weltkoordinatensystem?

Ich denke, die Intuition hier ist, dass ich einen Strahl verfolgen muss, der vom optischen Zentrum der Kamera (für die ich jetzt die 3D-Position wie oben beschrieben habe) durch die Bildebene [x, y] der Kamera und dann geht durch meine reale Ebene, die ich oben definiert habe.

Jetzt kann ich einen Weltkoordinaten-3D-Strahl mit einer Ebene schneiden, wie ich sie normal kenne, und auf diese Ebene zeigen. Was ich nicht verstehe, ist, wie ich die 3D-Position und -Richtung herausfinde, wenn sie die Bildebene durch ein Pixel verlässt. Es ist die Transformation durch verschiedene Koordinatensysteme, die mich verwirrt.

Gepard
quelle
Überprüfen Sie diese Antwort, es kann helfen. Wenn Sie denken, dass etwas abgeschlossen werden kann / könnte, sagen Sie es mir einfach. dsp.stackexchange.com/a/2737/1473
Jav_Rock

Antworten:

5

Wenn Sie die extrinsischen haben, dann ist es sehr einfach. Extrinsics zu haben ist dasselbe wie "Kamerapose" zu haben und dasselbe wie Homographie zu haben. Überprüfen Sie diesen Beitrag im Stackoverflow.

Sie haben Extrinsics, auch Kamerapose genannt, die als Übersetzung und Rotation beschrieben werden:

Pose=[R|t]=[R11R12R13txR21R22R23tyR31R32R33tz]

Sie können Homografie von Pose folgendermaßen erhalten :

H=1tz[R1xR2xtxR1yR2ytyR1zR2ztz]

Anschließend können Sie Ihre 2D-Punkte in die entsprechenden 3D-Punkte projizieren, indem Sie die Homografie mit den Punkten multiplizieren:

p2D=[xy1] add , um sie homogen zu machenz=1

p3D=Hp2D

p=p/p(z) Normalisieren Sie die Punkte

Jav_Rock
quelle
2

Sie können die 3D-Position des zweiten Punkts nicht kennen. Es kann sich um einen beliebigen Punkt auf dem Strahl von der Mitte der Kamera bis ins Unendliche handeln.

Sie können Folgendes tun:

  • Erstellen Sie einen vordefinierten 3D-Raum, der der realen Szene ähnelt
  • Wenn Sie mehr Bildpunkte aus einem anderen Winkel erhalten, können Sie mithilfe des Schnittpunkts der Strahlen aus verschiedenen Winkeln eine Annäherung an den 3D-Punkt erhalten.
Geerten
quelle
Abwarten. Ich kann den 3D-Weltpunkt finden, an dem der 3D-Strahl die planare Oberfläche schneidet, sicher? Da ich eine 3D-Weltkoordinate und eine 3D-Weltnormalen dieser Ebene kenne, ist der 3D-Punkt, den ich zu finden versuche, der Punkt, an dem er diese planare Oberfläche schneidet !! (Entschuldigung, ich glaube, meine Erklärung war nicht gut genug)
Cheetah
Was meinst du mit ebener Fläche? Die Bildebene oder die Ebene der Nullweltkoordinaten? Im letzteren Fall können Sie den Schnittpunkt berechnen, aber das bedeutet, dass Ihre 3D-Szene nicht 3D ist, sondern 2D :) (weil es eine Ebene ist).
Geerten
Ja, tut mir leid, das ist mir einfach nicht eingefallen. Ich verstehe, was Sie sagen, es macht für mich visuell einfach keinen Sinn. Also, ja, meine Szene ist tatsächlich "2d", weil ich die Bildebene und die reale Ebene habe, auf der der reale Ursprung [0,0,0] liegt und eine reale Normalen von [0,0, 1], daher hat jeder Punkt, der auf dieser realen Ebene liegt, die Form von [x, y, 0]. Ich weiß, dass ich den Schnittpunkt durch ax + by + cz + d = 0 berechnen kann, aber damit habe ich Probleme. (Fortsetzung im nächsten Kommentar)
Cheetah
Ich habe einen Strahl, der in meinem Kamerazentrum / Ursprung beginnt, für den ich die reale Welt [x, y, z] habe, und eine reale Welt normal [nx, ny, nz]. Ich muss von diesem Punkt aus einen Strahl abfeuern, der die Bildebene bei [u, v] schneidet und dann die reale Ebene bei [x, y, 0] schneidet (es ist dieses x, y, das ich erhalten möchte). Ich habe Probleme mit dem ersten Bit, dem Schnittpunkt mit der Bildebene. Ich kann nicht sehen, wie ich das mache?
Cheetah
Vielleicht möchten Sie sich Folgendes ansehen: en.wikipedia.org/wiki/Line-plane_intersection
Geerten
2

Sie haben zwei Möglichkeiten: Rückprojektion oder Projektion zwischen zwei Ebenen (Homographie).

Bei der Rückprojektion nehmen Sie eine Pseudo-Inverse Ihrer Kameramatrix und multiplizieren das Ergebnis mit Ihrer homogenen Darstellung des Bildpunkts:P

P=K[RRC]Xreprojected=P+x

Jetzt haben Sie eine 3D-Linie, die durch die und den Punkt . Wenn Sie möchten, können Sie dies in eine einfachere Präsentation umwandeln. Zum Beispiel mit einem Punkt- und Richtungsvektor (denken Sie daran, die homogenen Koordinaten so zu normalisieren, dass der Skalierungsfaktor vor den eigentlichen Berechnungen):CXV=ω[XYZ1]Tω=1

u=XreprojectedCv=uuL(t)=C+tv

Wenn Sie die Ebene , können Sie die Gleichung lösen für .Π=[π1π2π3π4]T,π1X+π2Y+π3Z+π4=0L(t)=Πt

Wenn Sie sich für die Verwendung der Homografie entscheiden, müssen Sie die Homografiematrix berechnen, die als Projektion zwischen der abgebildeten Ebene und der Ebene des Kamerasensors definiert ist:3×3H

Xplane=[XY01]Tx=PXplane=H[XY1]T

Wenn Sie nun : x

Xplane=H1x

Wenn Sie das während der Kalibrierung der Kamera nicht berechnet haben (wahrscheinlich mit direkter linearer Transformation, DLT), können Sie die folgende Formulierung verwenden:H

H=R+1dTNT

Wobei die Entfernung der Kamera von der Ebene und . (Ma, Soatto, Kosecká, Sastry - Eine Einladung zum 3-D-Sehen von Bildern zu geometrischen Modellen, S. 132)dT=RC

buq2
quelle