Name
vector_to_rel_poseT_vector_to_rel_poseVectorToRelPosevector_to_rel_poseVectorToRelPoseVectorToRelPose — Bestimmung der relativen Orientierung zweier Kameras unter
Verwendung vorgegebener Punktkorrespondenzen und bekannter
Kameraparameter sowie Rekonstruktion der 3D Raumpunkte.
vector_to_rel_pose( : : Rows1, Cols1, Rows2, Cols2, CovRR1, CovRC1, CovCC1, CovRR2, CovRC2, CovCC2, CamPar1, CamPar2, Method : RelPose, CovRelPose, Error, X, Y, Z, CovXYZ)
Herror T_vector_to_rel_pose(const Htuple Rows1, const Htuple Cols1, const Htuple Rows2, const Htuple Cols2, const Htuple CovRR1, const Htuple CovRC1, const Htuple CovCC1, const Htuple CovRR2, const Htuple CovRC2, const Htuple CovCC2, const Htuple CamPar1, const Htuple CamPar2, const Htuple Method, Htuple* RelPose, Htuple* CovRelPose, Htuple* Error, Htuple* X, Htuple* Y, Htuple* Z, Htuple* CovXYZ)
Herror vector_to_rel_pose(const HTuple& Rows1, const HTuple& Cols1, const HTuple& Rows2, const HTuple& Cols2, const HTuple& CovRR1, const HTuple& CovRC1, const HTuple& CovCC1, const HTuple& CovRR2, const HTuple& CovRC2, const HTuple& CovCC2, const HTuple& CamPar1, const HTuple& CamPar2, const HTuple& Method, HTuple* RelPose, HTuple* CovRelPose, HTuple* Error, HTuple* X, HTuple* Y, HTuple* Z, HTuple* CovXYZ)
void VectorToRelPose(const HTuple& Rows1, const HTuple& Cols1, const HTuple& Rows2, const HTuple& Cols2, const HTuple& CovRR1, const HTuple& CovRC1, const HTuple& CovCC1, const HTuple& CovRR2, const HTuple& CovRC2, const HTuple& CovCC2, const HTuple& CamPar1, const HTuple& CamPar2, const HTuple& Method, HTuple* RelPose, HTuple* CovRelPose, HTuple* Error, HTuple* X, HTuple* Y, HTuple* Z, HTuple* CovXYZ)
HTuple HPose::VectorToRelPose(const HTuple& Rows1, const HTuple& Cols1, const HTuple& Rows2, const HTuple& Cols2, const HTuple& CovRR1, const HTuple& CovRC1, const HTuple& CovCC1, const HTuple& CovRR2, const HTuple& CovRC2, const HTuple& CovCC2, const HTuple& CamPar1, const HTuple& CamPar2, const HString& Method, HTuple* Error, HTuple* X, HTuple* Y, HTuple* Z, HTuple* CovXYZ)
HTuple HPose::VectorToRelPose(const HTuple& Rows1, const HTuple& Cols1, const HTuple& Rows2, const HTuple& Cols2, const HTuple& CovRR1, const HTuple& CovRC1, const HTuple& CovCC1, const HTuple& CovRR2, const HTuple& CovRC2, const HTuple& CovCC2, const HTuple& CamPar1, const HTuple& CamPar2, const HString& Method, double* Error, HTuple* X, HTuple* Y, HTuple* Z, HTuple* CovXYZ)
HTuple HPose::VectorToRelPose(const HTuple& Rows1, const HTuple& Cols1, const HTuple& Rows2, const HTuple& Cols2, const HTuple& CovRR1, const HTuple& CovRC1, const HTuple& CovCC1, const HTuple& CovRR2, const HTuple& CovRC2, const HTuple& CovCC2, const HTuple& CamPar1, const HTuple& CamPar2, const char* Method, double* Error, HTuple* X, HTuple* Y, HTuple* Z, HTuple* CovXYZ)
void HOperatorSetX.VectorToRelPose(
[in] VARIANT Rows1, [in] VARIANT Cols1, [in] VARIANT Rows2, [in] VARIANT Cols2, [in] VARIANT CovRR1, [in] VARIANT CovRC1, [in] VARIANT CovCC1, [in] VARIANT CovRR2, [in] VARIANT CovRC2, [in] VARIANT CovCC2, [in] VARIANT CamPar1, [in] VARIANT CamPar2, [in] VARIANT Method, [out] VARIANT* RelPose, [out] VARIANT* CovRelPose, [out] VARIANT* Error, [out] VARIANT* X, [out] VARIANT* Y, [out] VARIANT* Z, [out] VARIANT* CovXYZ)
VARIANT HPoseX.VectorToRelPose(
[in] VARIANT Rows1, [in] VARIANT Cols1, [in] VARIANT Rows2, [in] VARIANT Cols2, [in] VARIANT CovRR1, [in] VARIANT CovRC1, [in] VARIANT CovCC1, [in] VARIANT CovRR2, [in] VARIANT CovRC2, [in] VARIANT CovCC2, [in] VARIANT CamPar1, [in] VARIANT CamPar2, [in] BSTR Method, [out] VARIANT* CovRelPose, [out] VARIANT* Error, [out] VARIANT* X, [out] VARIANT* Y, [out] VARIANT* Z, [out] VARIANT* CovXYZ)
static void HOperatorSet.VectorToRelPose(HTuple rows1, HTuple cols1, HTuple rows2, HTuple cols2, HTuple covRR1, HTuple covRC1, HTuple covCC1, HTuple covRR2, HTuple covRC2, HTuple covCC2, HTuple camPar1, HTuple camPar2, HTuple method, out HTuple relPose, out HTuple covRelPose, out HTuple error, out HTuple x, out HTuple y, out HTuple z, out HTuple covXYZ)
HTuple HPose.VectorToRelPose(HTuple rows1, HTuple cols1, HTuple rows2, HTuple cols2, HTuple covRR1, HTuple covRC1, HTuple covCC1, HTuple covRR2, HTuple covRC2, HTuple covCC2, HTuple camPar1, HTuple camPar2, string method, out HTuple error, out HTuple x, out HTuple y, out HTuple z, out HTuple covXYZ)
HTuple HPose.VectorToRelPose(HTuple rows1, HTuple cols1, HTuple rows2, HTuple cols2, HTuple covRR1, HTuple covRC1, HTuple covCC1, HTuple covRR2, HTuple covRC2, HTuple covCC2, HTuple camPar1, HTuple camPar2, string method, out double error, out HTuple x, out HTuple y, out HTuple z, out HTuple covXYZ)
vector_to_rel_posevector_to_rel_poseVectorToRelPosevector_to_rel_poseVectorToRelPoseVectorToRelPose ermittelt aus im allgemeinen mindestens sechs
vorgegebenen Punktkorrespondenzen eines Stereobildpaares die
relative Orientierung der beiden Kameras zueinander.
RelPoseRelPoseRelPoseRelPoseRelPoserelPose gibt die Orientierung der Kamera 1 relative zur
Kamera 2 an (Siehe create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose für weitere Information
über die Beschreibung von Orientierungen.).
Dies steht in Übereinstimmung mit der expliziten Kalibrierung einer
Stereokonfiguration mit dem Operator calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras.
Sei R,t die Rotation beziehungsweise Translation der relativen
Orientierung. Die Essential-Matrix E ist dann durch
E=([t]_x R)^T definiert,
wobei [t]_x eine 3x3 schiefsymmetrische
Matrix ist, welche das Kreuzprodukt mit dem Vektor t beschreibt.
Die gesuchte Orientierung kann mittels der Epipolar-Gleichungen
bestimmt werden:
T
/ X2 \ T / X1 \ / 0 -t_z t_y \
| Y2 | * ([t]_x R) * | Y1 | = 0 mit [t]_x = | t_z 0 -t_x | .
\ 1 / \ 1 / \ -t_y t_x 0 /
Zu beachten ist, dass die Essential-Matrix eine homogene Größe ist, d.h. sie
ist bis auf einen Skalierungsfaktor bestimmt. Somit kann der
Translationsvektor der relativen Orientierung auch nur bis auf eine
Skalierung berechnet werden. Der Operator wird diesen Vektor
auf die Länge eins normiert berechnen. Als Konsequenz ergibt sich, dass
die Rekonstruktion der betrachteten Szene, hier in Form der Punkte
gegeben durch deren 3D Koordinaten
(XXXXXx,YYYYYy,ZZZZZz), auch nur
bis auf einen globalen Skalierungsfaktor durchgeführt werden
kann. Sollen die absoluten 3D Koordinaten der Szenenpunkte
rekonstruiert werden, so ist es notwendig in beiden Bildern einen
bekannten Maßstab zu sehen. In der Praxis kann dieser Maßstab
z.B. durch den Abstand zweier beliebiger Punkte gegeben sein.
Der Operator vector_to_rel_posevector_to_rel_poseVectorToRelPosevector_to_rel_poseVectorToRelPoseVectorToRelPose ist für ein nichtlineares
Kameramodell konzipiert und beschreibt somit auch radiale
Linsenverzeichnungen. Dies steht im Gegensatz zum Operator
vector_to_essential_matrixvector_to_essential_matrixVectorToEssentialMatrixvector_to_essential_matrixVectorToEssentialMatrixVectorToEssentialMatrix, welcher nur Geraden
erhaltende, d.h. lineare, Kameras beschreibt. Kameraparameter
werden mit den Argumenten CamPar1CamPar1CamPar1CamPar1CamPar1camPar1 und CamPar2CamPar2CamPar2CamPar2CamPar2camPar2
übergeben. Die 3D Richtungsvektoren (X1,Y1,1) und
(X2,Y2,1) werden
aus den Punktkoordinaten (Rows1Rows1Rows1Rows1Rows1rows1,Cols1Cols1Cols1Cols1Cols1cols1) und
(Rows2Rows2Rows2Rows2Rows2rows2,Cols2Cols2Cols2Cols2Cols2cols2) durch Invertierung der
Kameraprojektion berechnet (siehe calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras).
Der Parameter MethodMethodMethodMethodMethodmethod gibt an, ob die Kameras sich in einer
besonderen relativen Orientierung zueinander befinden, und bestimmt auch das
Berechnungsverfahren. Für 'normalized_dlt'"normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt" und
'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard""gold_standard" kann die relative Lage der Kameras zueinander
beliebig sein.
Für 'trans_normalized_dlt'"trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt" and 'trans_gold_standard'"trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard" ist
die relative Lage eine reine Translation. In diesem speziellen Fall ist die
minimale Anzahl an notwendigen Punktkorrespondenzen nicht sechs, sondern nur
zwei.
Wird 'normalized_dlt'"normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt" oder 'trans_normalized_dlt'"trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt"
gewählt, so ist das Berechnungsverfahren ein lineares Verfahren.
Wird 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard""gold_standard" oder 'trans_gold_standard'"trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard"
gewählt, so ist das Berechnungsverfahren im statistischen Sinne optimal.
Beide Verfahren liefern die Koordinaten (XXXXXx,YYYYYy,ZZZZZz)
der rekonstruierten Raumpunkte.
Die optimalen Verfahren berechnen zusätzlich die 3x3
Kovarianzmatrizen CovXYZCovXYZCovXYZCovXYZCovXYZcovXYZ der Raumpunkte.
Ist n die Anzahl der Korrespondenzen, so
werden diese Kovarianzen in einem 9xn Tupel
aneinandergehängt.
Weiterhin geben die optimalen Verfahren auch die Kovarianz der relativen
Lage CovRelPoseCovRelPoseCovRelPoseCovRelPoseCovRelPosecovRelPose an, welche eine 6x6 Matrix ist.
Falls die Bildpunkte mit
einem Operator wie points_foerstnerpoints_foerstnerPointsFoerstnerpoints_foerstnerPointsFoerstnerPointsFoerstner, der die Kovarianzmatrix
für jeden Punkt zurückliefert, extrahiert wurden, kann dies in der
Berechnung berücksichtigt werden, indem die Kovarianzen in
CovRR1CovRR1CovRR1CovRR1CovRR1covRR1, CovRC1CovRC1CovRC1CovRC1CovRC1covRC1, CovCC1CovCC1CovCC1CovCC1CovCC1covCC1 für die Punkte des
ersten Bildes und in CovRR2CovRR2CovRR2CovRR2CovRR2covRR2, CovRC2CovRC2CovRC2CovRC2CovRC2covRC2,
CovCC2CovCC2CovCC2CovCC2CovCC2covCC2 für die Punkte des zweiten Bildes übergeben werden.
Die Kovarianzmatrizen sind symmetrische 2x2
Matrizen. CovRR1CovRR1CovRR1CovRR1CovRR1covRR1/CovRR2CovRR2CovRR2CovRR2CovRR2covRR2 und
CovCC1CovCC1CovCC1CovCC1CovCC1covCC1/CovCC2CovCC2CovCC2CovCC2CovCC2covCC2 sind dabei die Diagonalelemente der
Matrizen, während CovRC1CovRC1CovRC1CovRC1CovRC1covRC1/CovRC2CovRC2CovRC2CovRC2CovRC2covRC2 die beiden nicht diagonalen
Elemente angeben.
Sind die Kovarianzen unbekannt, so werden zur Berechnung intern
Einheits-Kovarianzmatrizen angenommen, und in den
Kovarianzparametern können leere Tupel übergeben werden.
Die Größe ErrorErrorErrorErrorErrorerror ist ein Gütemaß für die Berechnung der
relativen Lage und gibt den mittleren euklidischen Abstand in Pixeln
zwischen den Punkten und ihren korrespondierenden Epipolarlinien an.
Bei dem Operator vector_to_rel_posevector_to_rel_poseVectorToRelPosevector_to_rel_poseVectorToRelPoseVectorToRelPose ist folgender
Spezialfall zu beachten:
Liegen alle abgebildeten Raumpunkte in einer einzigen Ebene und liegen
zusätzlich alle Raumpunkte näher zu einer der beiden Kameras,
so gibt es insgesamt zwei Lösungen. Das heißt, dass in diesem Fall das
Problem der Berechnung der relativen Lage nicht eindeutig lösbar ist.
Es werden daher auch beide Lösungen ausgegeben. Das bedeutet, dass
alle Ausgabeparameter von doppelter Länge sind, wobei die Werte der
zweiten Lösung an die Werte der ersten Lösung hinten angehängt sind.
Sind die Korrespondenzen zwischen den Punkten noch nicht bekannt, so
ist match_rel_pose_ransacmatch_rel_pose_ransacMatchRelPoseRansacmatch_rel_pose_ransacMatchRelPoseRansacMatchRelPoseRansac zur Bestimmung
der Korrespondenzen sowie der Stereo-Geometrie zu verwenden.
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Wird ohne Parallelisierung verarbeitet.
Eingabepunkte in Bild 1 (Zeilenkoordinate).
Restriktion: length(Rows1) >= 6 || length(Rows1) >= 2
Eingabepunkte in Bild 1 (Spaltenkoordinate).
Restriktion: length(Cols1) == length(Rows1)
Eingabepunkte in Bild 2 (Zeilenkoordinate).
Restriktion: length(Rows2) == length(Rows1)
Eingabepunkte in Bild 2 (Spaltenkoordinate).
Restriktion: length(Cols2) == length(Rows1)
Varianz in Zeilenrichtung der Punkte in Bild 1.
Defaultwert: []
Kovarianz der Punkte in Bild 1.
Defaultwert: []
Varianz in Spaltenrichtung der Punkte in Bild 1.
Defaultwert: []
Varianz in Zeilenrichtung der Punkte in Bild 2.
Defaultwert: []
Kovarianz der Punkte in Bild 2.
Defaultwert: []
Varianz in Spaltenrichtung der Punkte in Bild 2.
Defaultwert: []
Kameraparameter der 1. Kamera.
Kameraparameter der 2. Kamera.
Algorithmus zur Berechnung der relativen Lage
und zur Auswahl spezieller relativer Lagen.
Defaultwert:
'normalized_dlt'
"normalized_dlt"
"normalized_dlt"
"normalized_dlt"
"normalized_dlt"
"normalized_dlt"
Werteliste: 'gold_standard'"gold_standard""gold_standard""gold_standard""gold_standard""gold_standard", 'normalized_dlt'"normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt""normalized_dlt", 'trans_gold_standard'"trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard""trans_gold_standard", 'trans_normalized_dlt'"trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt""trans_normalized_dlt"
Berechnete relative Lage der Kameras zueinander
(3D-Pose).
6x6 Kovarianzmatrix der relativen
Lage.
Mittlerer, quadratischer Epipolar Abstand.
XXXXXx (output_control) real-array → HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)
X-Koordinaten der rekonstruierten Punkte.
YYYYYy (output_control) real-array → HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)
Y-Koordinaten der rekonstruierten Punkte.
ZZZZZz (output_control) real-array → HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)
Z-Koordinaten der rekonstruierten Punkte.
Kovarianzmatrizen der rekonstruierten 3D Punkte.
match_rel_pose_ransacmatch_rel_pose_ransacMatchRelPoseRansacmatch_rel_pose_ransacMatchRelPoseRansacMatchRelPoseRansac
gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap,
rel_pose_to_fundamental_matrixrel_pose_to_fundamental_matrixRelPoseToFundamentalMatrixrel_pose_to_fundamental_matrixRelPoseToFundamentalMatrixRelPoseToFundamentalMatrix
vector_to_essential_matrixvector_to_essential_matrixVectorToEssentialMatrixvector_to_essential_matrixVectorToEssentialMatrixVectorToEssentialMatrix,
vector_to_fundamental_matrixvector_to_fundamental_matrixVectorToFundamentalMatrixvector_to_fundamental_matrixVectorToFundamentalMatrixVectorToFundamentalMatrix,
binocular_calibrationbinocular_calibrationBinocularCalibrationbinocular_calibrationBinocularCalibrationBinocularCalibration
camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration
Richard Hartley, Andrew Zisserman: „Multiple View Geometry in
Computer Vision“; Cambridge University Press, Cambridge; 2003.
J.Chris McGlone (editor): „Manual of Photogrammetry“ ;
American Society for Photogrammetry and Remote Sensing ; 2004.
3D Metrology