Name
binocular_calibrationT_binocular_calibrationBinocularCalibrationbinocular_calibrationBinocularCalibrationBinocularCalibration — Bestimmung aller Kameraparameter eines binokularen Stereoaufbaus.
binocular_calibration( : : NX, NY, NZ, NRow1, NCol1, NRow2, NCol2, StartCamParam1, StartCamParam2, NStartPose1, NStartPose2, EstimateParams : CamParam1, CamParam2, NFinalPose1, NFinalPose2, RelPose, Errors)
Herror T_binocular_calibration(const Htuple NX, const Htuple NY, const Htuple NZ, const Htuple NRow1, const Htuple NCol1, const Htuple NRow2, const Htuple NCol2, const Htuple StartCamParam1, const Htuple StartCamParam2, const Htuple NStartPose1, const Htuple NStartPose2, const Htuple EstimateParams, Htuple* CamParam1, Htuple* CamParam2, Htuple* NFinalPose1, Htuple* NFinalPose2, Htuple* RelPose, Htuple* Errors)
Herror binocular_calibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow1, const HTuple& NCol1, const HTuple& NRow2, const HTuple& NCol2, const HTuple& StartCamParam1, const HTuple& StartCamParam2, const HTuple& NStartPose1, const HTuple& NStartPose2, const HTuple& EstimateParams, HTuple* CamParam1, HTuple* CamParam2, HTuple* NFinalPose1, HTuple* NFinalPose2, HTuple* RelPose, HTuple* Errors)
void BinocularCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow1, const HTuple& NCol1, const HTuple& NRow2, const HTuple& NCol2, const HTuple& StartCamParam1, const HTuple& StartCamParam2, const HTuple& NStartPose1, const HTuple& NStartPose2, const HTuple& EstimateParams, HTuple* CamParam1, HTuple* CamParam2, HTuple* NFinalPose1, HTuple* NFinalPose2, HTuple* RelPose, HTuple* Errors)
static HTuple HPose::BinocularCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow1, const HTuple& NCol1, const HTuple& NRow2, const HTuple& NCol2, const HTuple& StartCamParam1, const HTuple& StartCamParam2, const HPoseArray& NStartPose1, const HPoseArray& NStartPose2, const HTuple& EstimateParams, HTuple* CamParam2, HPoseArray* NFinalPose1, HPoseArray* NFinalPose2, HPose* RelPose, HTuple* Errors)
HTuple HPose::BinocularCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow1, const HTuple& NCol1, const HTuple& NRow2, const HTuple& NCol2, const HTuple& StartCamParam1, const HTuple& StartCamParam2, const HPose& NStartPose2, const HString& EstimateParams, HTuple* CamParam2, HPose* NFinalPose1, HPose* NFinalPose2, HPose* RelPose, double* Errors) const
HTuple HPose::BinocularCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow1, const HTuple& NCol1, const HTuple& NRow2, const HTuple& NCol2, const HTuple& StartCamParam1, const HTuple& StartCamParam2, const HPose& NStartPose2, const char* EstimateParams, HTuple* CamParam2, HPose* NFinalPose1, HPose* NFinalPose2, HPose* RelPose, double* Errors) const
void HOperatorSetX.BinocularCalibration(
[in] VARIANT NX, [in] VARIANT NY, [in] VARIANT NZ, [in] VARIANT NRow1, [in] VARIANT NCol1, [in] VARIANT NRow2, [in] VARIANT NCol2, [in] VARIANT StartCamParam1, [in] VARIANT StartCamParam2, [in] VARIANT NStartPose1, [in] VARIANT NStartPose2, [in] VARIANT EstimateParams, [out] VARIANT* CamParam1, [out] VARIANT* CamParam2, [out] VARIANT* NFinalPose1, [out] VARIANT* NFinalPose2, [out] VARIANT* RelPose, [out] VARIANT* Errors)
VARIANT HPoseX.BinocularCalibration(
[in] VARIANT NX, [in] VARIANT NY, [in] VARIANT NZ, [in] VARIANT NRow1, [in] VARIANT NCol1, [in] VARIANT NRow2, [in] VARIANT NCol2, [in] VARIANT StartCamParam1, [in] VARIANT StartCamParam2, [in] VARIANT NStartPose1, [in] VARIANT NStartPose2, [in] VARIANT EstimateParams, [out] VARIANT* CamParam2, [out] VARIANT* NFinalPose1, [out] VARIANT* NFinalPose2, [out] VARIANT* RelPose, [out] VARIANT* Errors)
static void HOperatorSet.BinocularCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow1, HTuple NCol1, HTuple NRow2, HTuple NCol2, HTuple startCamParam1, HTuple startCamParam2, HTuple NStartPose1, HTuple NStartPose2, HTuple estimateParams, out HTuple camParam1, out HTuple camParam2, out HTuple NFinalPose1, out HTuple NFinalPose2, out HTuple relPose, out HTuple errors)
static HTuple HPose.BinocularCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow1, HTuple NCol1, HTuple NRow2, HTuple NCol2, HTuple startCamParam1, HTuple startCamParam2, HPose[] NStartPose1, HPose[] NStartPose2, HTuple estimateParams, out HTuple camParam2, out HPose[] NFinalPose1, out HPose[] NFinalPose2, out HPose relPose, out HTuple errors)
HTuple HPose.BinocularCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow1, HTuple NCol1, HTuple NRow2, HTuple NCol2, HTuple startCamParam1, HTuple startCamParam2, HPose NStartPose2, string estimateParams, out HTuple camParam2, out HPose NFinalPose1, out HPose NFinalPose2, out HPose relPose, out double errors)
Im Allgemeinen bedeutet binokulare Kalibrierung die exakte Bestimmung der
Parameter, welche die 3D Rekonstruktion eines 3D Punktes von den
korrespondierenden Abbildungen dieses Punktes in einem binokularen
Stereo System
modellieren. Diese Rekonstruktion wird durch die internen Parameter
CamParam1CamParam1CamParam1CamParam1CamParam1camParam1 von Kamera 1 und CamParam2CamParam2CamParam2CamParam2CamParam2camParam2 von Kamera 2 bestimmt,
welche das zugrunde liegende projektive Kameramodell beschreiben, und
von den externen Parametern RelPoseRelPoseRelPoseRelPoseRelPoserelPose, welche die relative Lage des
Kamerasystems 2 im Kamerasystem 1 beschreiben.
Die bekannten 3D Modellpunkte (mit den Koordinaten NXNXNXNXNXNX,
NYNYNYNYNYNY, NZNZNZNZNZNZ) werden in die Bildebene der beiden Kameras
(Kamera 1 und Kamera 2) projiziert. Die Summe der quadrierten
Abstände zwischen diesen Projektionen und den korrespondierenden
Bildpunkten (mit den Koordinaten NRow1NRow1NRow1NRow1NRow1NRow1, NCol1NCol1NCol1NCol1NCol1NCol1 für
Kamera 1 und NRow2NRow2NRow2NRow2NRow2NRow2, NCol2NCol2NCol2NCol2NCol2NCol2 für Kamera 2) wird
daraufhin minimiert. Es muss darauf geachtet werden, dass alle
Modellpunkte in beiden Bildern sichtbar sein müssen. Das zugrunde
liegende Kameramodell wird in der Beschreibung des
camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration Operators erläutert.
Wenn die Verzeichnungen durch das Divisionsmodell modelliert werden
sollen, wird das Kameramodell durch die Parameter [focus, kappa, sx,
sy, cx, cy, image_width, image_height] (für jede Kamera separat)
beschrieben (focus > 0). Sollen die Verzeichungen durch das
Polynommodell modelliert werden, so wird das Kameramodell durch die
Parameter [focus, k1, k2, k3, p1, p2, sx, sy, cx, cy, image_width,
image_height] (für jede Kamera separat) beschrieben (focus > 0).
Die initialen Werte dieser internen Parameter
werden in StartCamParam1StartCamParam1StartCamParam1StartCamParam1StartCamParam1startCamParam1 für Kamera 1 und StartCamParam2StartCamParam2StartCamParam2StartCamParam2StartCamParam2startCamParam2
für Kamera 2 übergeben. Als Näherungswert kann man diese den Datenblättern
der Kameras entnehmen. Zusätzlich werden die initialen Näherungswerte
NStartPose1NStartPose1NStartPose1NStartPose1NStartPose1NStartPose1 und NStartPose2NStartPose2NStartPose2NStartPose2NStartPose2NStartPose2 für die einzelnen
Lagen des 3D Kalibriermodells bezüglich des jeweiligen
Kamerakoordinatensystems (CCS) von Kamera 1 und Kamera 2
benötigt. Diese Lagen kann man durch den Operator
find_marks_and_posefind_marks_and_poseFindMarksAndPosefind_marks_and_poseFindMarksAndPoseFindMarksAndPose erhalten. Da der Kalibrier-Algorithmus
gleichzeitig Korrespondenzen zwischen gemessenen Bild- und
bekannten Modellpunkten aus mehreren Bildpaaren behandeln kann,
müssen die Lagen (NStartPose1NStartPose1NStartPose1NStartPose1NStartPose1NStartPose1, NStartPose2NStartPose2NStartPose2NStartPose2NStartPose2NStartPose2) und die
gemessenen Punkte (NRow1NRow1NRow1NRow1NRow1NRow1, NCol1NCol1NCol1NCol1NCol1NCol1, NRow2NRow2NRow2NRow2NRow2NRow2,
NCol2NCol2NCol2NCol2NCol2NCol2) in einer zu den Bildern korrespondierenden
Reihenfolge übergeben werden.
Der Eingabeparameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams legt die zu berechnenden
Kameraparameter fest. Üblicherweise wird dieser Parameter auf 'all'"all""all""all""all""all"
gesetzt, d.h. alle externen (Translationen und Rotationen) und alle
internen Kameraparameter werden bestimmt. Falls die internen
Parameter schon bestimmt worden sind (z.B. durch einen früheren
Aufrufen von binocular_calibrationbinocular_calibrationBinocularCalibrationbinocular_calibrationBinocularCalibrationBinocularCalibration), ist es oftmals interessant,
lediglich die 3D-Lage der Kamerasysteme zueinander zu bestimmen
(RelPoseRelPoseRelPoseRelPoseRelPoserelPose). In diesem Fall kann in EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams der
Wert 'pose_rel'"pose_rel""pose_rel""pose_rel""pose_rel""pose_rel" übergeben werden. Dies hat denselben Effekt
wie EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams = ['pose1', 'pose2']["pose1", "pose2"]["pose1", "pose2"]["pose1", "pose2"]["pose1", "pose2"]["pose1", "pose2"].
Auch die internen Kameraparameter lassen sich mit den Werten
'cam_param1'"cam_param1""cam_param1""cam_param1""cam_param1""cam_param1" b.z.w. 'cam_param2'"cam_param2""cam_param2""cam_param2""cam_param2""cam_param2" zusammenfassen.
Andernfalls enthält EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams ein Tuple von Stringwerten,
welche die zu schätzenden Kameraparameter festlegen.
Wenn das Polynommodell für die Modellierung der Verzeichnungen
verwendet wird, ist zu beachten, dass die Werte 'k1'"k1""k1""k1""k1""k1",
'k2'"k2""k2""k2""k2""k2", 'k3'"k3""k3""k3""k3""k3", 'p1'"p1""p1""p1""p1""p1" und 'p2'"p2""p2""p2""p2""p2",
nicht einzeln in EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams gesetzt werden können,
sondern nur in den folgenden Gruppen (wobei 'i'"i""i""i""i""i" für den
Index der Kamera steht):
- 'poly_i':
'k1_i'"k1_i""k1_i""k1_i""k1_i""k1_i", 'k2_i'"k2_i""k2_i""k2_i""k2_i""k2_i",
'k3_i'"k3_i""k3_i""k3_i""k3_i""k3_i", 'p1_i'"p1_i""p1_i""p1_i""p1_i""p1_i"
und 'p2_i'"p2_i""p2_i""p2_i""p2_i""p2_i"
- 'poly_rad_2_i':
'k1_i'"k1_i""k1_i""k1_i""k1_i""k1_i"
- 'poly_rad_4_i':
'k1_i'"k1_i""k1_i""k1_i""k1_i""k1_i" und 'k2_i'"k2_i""k2_i""k2_i""k2_i""k2_i"
- 'poly_rad_6_i':
'k1_i'"k1_i""k1_i""k1_i""k1_i""k1_i", 'k2_i'"k2_i""k2_i""k2_i""k2_i""k2_i" und
'k3_i'"k3_i""k3_i""k3_i""k3_i""k3_i"
- 'poly_tan_2_i':
'p1_i'"p1_i""p1_i""p1_i""p1_i""p1_i" und 'p2_i'"p2_i""p2_i""p2_i""p2_i""p2_i"
Es ist auch
möglich, Parameter die nicht geschätzt werden sollen über ein
vorgesetztes '~' Zeichen im String auszuschließen.
Die Werte ['pose1','~transx1']["pose1","~transx1"]["pose1","~transx1"]["pose1","~transx1"]["pose1","~transx1"]["pose1","~transx1"] beispielsweise haben
denselben Effekt wie
['alpha1','beta1','gamma1','transy1','transz1']["alpha1","beta1","gamma1","transy1","transz1"]["alpha1","beta1","gamma1","transy1","transz1"]["alpha1","beta1","gamma1","transy1","transz1"]["alpha1","beta1","gamma1","transy1","transz1"]["alpha1","beta1","gamma1","transy1","transz1"].
['all','~focus1']["all","~focus1"]["all","~focus1"]["all","~focus1"]["all","~focus1"]["all","~focus1"]
dagegen schätzt alle internen und externen Parameter bis auf die
Brennweite von Kamera1. Das '~' Präfix
kann mit Ausnahme von 'all', 'poly_rad_2_i' und 'poly_rad_4_i' jedem
Parameterwert vorangestellt werden.
Die geschätzeten Kameraparameter werden in CamParam1CamParam1CamParam1CamParam1CamParam1camParam1 und
CamParam2CamParam2CamParam2CamParam2CamParam2camParam2 zurückgegeben. Die externen Parameter
[transx_rel, transy_rel, transz_rel, alpha_rel, beta_rel, gamma_rel]
werden in
RelPoseRelPoseRelPoseRelPoseRelPoserelPose zurückgegeben und legen die 3D Transformation von
Punkten von CCS 2 nach CCS 1 fest. Gemäß der Festlegung von Lagen in
der Beschreibung des Operators create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose wird ein
Parameter an der letzten Position des obigen Tupels angehängt um den
Typ der Lagebeschreibung festzulegen.
Entsprechend zu camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration wird die 3D Transformation des
Kalibriermodells zum jeweiligen CCS in NFinalPose1NFinalPose1NFinalPose1NFinalPose1NFinalPose1NFinalPose1 und
NFinalPose2NFinalPose2NFinalPose2NFinalPose2NFinalPose2NFinalPose2 zurückgegeben. Diese Transformationen hängen
mit RelPoseRelPoseRelPoseRelPoseRelPoserelPose gemäß der folgenden Gleichung zusammen (unter
Vernachlässigung der Effekte durch die Ausgleichsrechung der
Mehr-Bild-Kalibrierung):
HomMat3D_NFinalPose2 = INV(HomMat3D_RelPose) * HomMat3D_NFinalPose1 ,
wobei HomMat3D_* die homogene Transformationsmatrix der
entsprechenden Lage beschreibt und INV() eine homogene Matrix
invertiert.
Die errechneten mittleren Fehler für jede Kamera, welche in
ErrorsErrorsErrorsErrorsErrorserrors zurückgegeben werden, vermitteln einen Eindruck von
der Genauigkeit der Kalibrierung. Er beschreibt einen mittleren euklidischen
Abstand der mit den ermittelten Parametern ins Bild projezierten
Mittelpunkte der Modellmarken von ihren Abbildungen.
Bei der Verwendung von Kameras mit telezentrischen Objektiven müssen
zusätzliche Voraussetzungen für den Kalibrieraufbau gelten. Diese können
in der Dokumentation von calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras nachgelesen werden.
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Wird ohne Parallelisierung verarbeitet.
NXNXNXNXNXNX (input_control) number-array → HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)
Geordnetes Tupel mit allen X-Koordinaten
der Kalibriermarken (in Meter).
NYNYNYNYNYNY (input_control) number-array → HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)
Geordnetes Tupel mit allen Y-Koordinaten
der Kalibriermarken (in Meter).
NZNZNZNZNZNZ (input_control) number-array → HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)
Geordnetes Tupel mit allen Z-Koordinaten
der Kalibriermarken (in Meter).
Geordnetes Tupel mit allen Zeilen-Koordinaten
der extrahierten Kalibriermarken von Kamera 1
(in Pixel).
Geordnetes Tupel mit allen Spalten-Koordinaten
der extrahierten Kalibriermarken von Kamera 1
(in Pixel).
Geordnetes Tupel mit allen Zeilen-Koordinaten
der extrahierten Kalibriermarken von Kamera 2
(in Pixel).
Geordnetes Tupel mit allen Spalten-Koordinaten
der extrahierten Kalibriermarken von Kamera 2
(in Pixel).
Startwerte für die internen Parameter
der projektiven Kamera 1.
Parameteranzahl: StartCamParam1 == 8 || StartCamParam1 == 12 || StartCamParam1 == StartCamParam2
Startwerte für die internen Parameter
der projektiven Kamera 2.
Parameteranzahl: StartCamParam2 == 8 || StartCamParam2 == 12 || StartCamParam2 == StartCamParam1
Geordnetes Tupel mit allen Startwerten der
externen Parameter von Kamera 1.
Geordnetes Tupel mit allen Startwerten der
externen Parameter von Kamera 2.
Zu schätzenden Kameraparameter.
Defaultwert:
'all'
"all"
"all"
"all"
"all"
"all"
Werteliste: 'all'"all""all""all""all""all", 'alpha1'"alpha1""alpha1""alpha1""alpha1""alpha1", 'alpha2'"alpha2""alpha2""alpha2""alpha2""alpha2", 'beta1'"beta1""beta1""beta1""beta1""beta1", 'beta2'"beta2""beta2""beta2""beta2""beta2", 'cam_param1'"cam_param1""cam_param1""cam_param1""cam_param1""cam_param1", 'cam_param2'"cam_param2""cam_param2""cam_param2""cam_param2""cam_param2", 'cx1'"cx1""cx1""cx1""cx1""cx1", 'cx2'"cx2""cx2""cx2""cx2""cx2", 'cy1'"cy1""cy1""cy1""cy1""cy1", 'cy2'"cy2""cy2""cy2""cy2""cy2", 'focus1'"focus1""focus1""focus1""focus1""focus1", 'focus2'"focus2""focus2""focus2""focus2""focus2", 'gamma1'"gamma1""gamma1""gamma1""gamma1""gamma1", 'gamma2'"gamma2""gamma2""gamma2""gamma2""gamma2", 'kappa1'"kappa1""kappa1""kappa1""kappa1""kappa1", 'kappa2'"kappa2""kappa2""kappa2""kappa2""kappa2", 'poly_1'"poly_1""poly_1""poly_1""poly_1""poly_1", 'poly_2'"poly_2""poly_2""poly_2""poly_2""poly_2", 'poly_rad_2_1'"poly_rad_2_1""poly_rad_2_1""poly_rad_2_1""poly_rad_2_1""poly_rad_2_1", 'poly_rad_2_2'"poly_rad_2_2""poly_rad_2_2""poly_rad_2_2""poly_rad_2_2""poly_rad_2_2", 'poly_rad_4_1'"poly_rad_4_1""poly_rad_4_1""poly_rad_4_1""poly_rad_4_1""poly_rad_4_1", 'poly_rad_4_2'"poly_rad_4_2""poly_rad_4_2""poly_rad_4_2""poly_rad_4_2""poly_rad_4_2", 'poly_rad_6_1'"poly_rad_6_1""poly_rad_6_1""poly_rad_6_1""poly_rad_6_1""poly_rad_6_1", 'poly_rad_6_2'"poly_rad_6_2""poly_rad_6_2""poly_rad_6_2""poly_rad_6_2""poly_rad_6_2", 'poly_tan_2_1'"poly_tan_2_1""poly_tan_2_1""poly_tan_2_1""poly_tan_2_1""poly_tan_2_1", 'poly_tan_2_2'"poly_tan_2_2""poly_tan_2_2""poly_tan_2_2""poly_tan_2_2""poly_tan_2_2", 'pose1'"pose1""pose1""pose1""pose1""pose1", 'pose2'"pose2""pose2""pose2""pose2""pose2", 'pose_rel'"pose_rel""pose_rel""pose_rel""pose_rel""pose_rel", 'sx1'"sx1""sx1""sx1""sx1""sx1", 'sx2'"sx2""sx2""sx2""sx2""sx2", 'sy1'"sy1""sy1""sy1""sy1""sy1", 'sy2'"sy2""sy2""sy2""sy2""sy2", 'transx1'"transx1""transx1""transx1""transx1""transx1", 'transx2'"transx2""transx2""transx2""transx2""transx2", 'transy1'"transy1""transy1""transy1""transy1""transy1", 'transy2'"transy2""transy2""transy2""transy2""transy2", 'transz1'"transz1""transz1""transz1""transz1""transz1", 'transz2'"transz2""transz2""transz2""transz2""transz2"
Interne Parameter der projektiven Kamera 1.
Interne Parameter der projektiven Kamera 2.
Geordnetes Tupel mit allen externen Parametern
von Kamera 1.
Geordnetes Tupel mit allen externen Parametern
von Kamera 2.
Lage von Kamera 2 bezüglich Kamera 1.
Durchschnittlicher Fehler in Pixel.
* open image source
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_l.seq', 'default', 0, -1, AcqHandle1)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_r.seq', 'default', 1, -1, AcqHandle2)
* initialize the start parameters
create_caltab (0.03, 'caltab_30.descr', 'caltab_30.ps')
caltab_points ('caltab_30.descr', X, Y, Z)
StartCamParam1 := [0.0125, 0, 7.4e-6, 7.4e-6, Width/2.0, Height/2.0, \
Width, Height]
StartCamParam2 := StartCamParam1
Rows1 := []
Cols1 := []
StartPoses1 := []
Rows2 := []
Cols2 := []
StartPoses2 := []
* find calibration marks and startposes
for i := 0 to 11 by 1
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
find_caltab (Image1, Caltab1, 'caltab_30.descr', 3, 120, 5)
find_caltab (Image2, Caltab2, 'caltab_30.descr', 3, 120, 5)
find_marks_and_pose (Image1, Caltab1, 'caltab_30.descr', StartCamParam1, \
128, 10, 20, 0.7, 5, 100, RCoord1, CCoord1, \
StartPose1)
Rows1 := [Rows1,RCoord1]
Cols1 := [Cols1,CCoord1]
StartPoses1 := [StartPoses1,StartPose1]
find_marks_and_pose (Image2, Caltab2, 'caltab_30.descr', StartCamParam2, \
128, 10, 20, 0.7, 5, 100, RCoord2, CCoord2, \
StartPose2)
Rows2 := [Rows2,RCoord2]
Cols2 := [Cols2,CCoord2]
StartPoses2 := [StartPoses2,StartPose2]
endfor
* calibrate the stereo rig
binocular_calibration (X, Y, Z, Rows1, Cols1, Rows2, Cols2, StartCamParam1, \
StartCamParam2, StartPoses1, StartPoses2, 'all', \
CamParam1, CamParam2, NFinalPose1, NFinalPose2, \
RelPose, Errors)
* archive the results
write_cam_par (CamParam1, 'cam_left-125.dat')
write_cam_par (CamParam2, 'cam_right-125.dat')
write_pose (RelPose, 'rel_pose.dat')
* rectify the stereo images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1,'geometric', 'bilinear', CamParamRect1, CamParamRect2, Cam1PoseRect1, \
Cam2PoseRect2, RelPoseRect)
map_image (Image1, Map1, ImageMapped1)
map_image (Image2, Map2, ImageMapped2)
* open image source
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_l.seq', 'default', 0, -1, AcqHandle1)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_r.seq', 'default', 1, -1, AcqHandle2)
* initialize the start parameters
create_caltab (0.03, 'caltab_30.descr', 'caltab_30.ps')
caltab_points ('caltab_30.descr', X, Y, Z)
StartCamParam1 := [0.0125, 0, 7.4e-6, 7.4e-6, Width/2.0, Height/2.0, \
Width, Height]
StartCamParam2 := StartCamParam1
Rows1 := []
Cols1 := []
StartPoses1 := []
Rows2 := []
Cols2 := []
StartPoses2 := []
* find calibration marks and startposes
for i := 0 to 11 by 1
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
find_caltab (Image1, Caltab1, 'caltab_30.descr', 3, 120, 5)
find_caltab (Image2, Caltab2, 'caltab_30.descr', 3, 120, 5)
find_marks_and_pose (Image1, Caltab1, 'caltab_30.descr', StartCamParam1, \
128, 10, 20, 0.7, 5, 100, RCoord1, CCoord1, \
StartPose1)
Rows1 := [Rows1,RCoord1]
Cols1 := [Cols1,CCoord1]
StartPoses1 := [StartPoses1,StartPose1]
find_marks_and_pose (Image2, Caltab2, 'caltab_30.descr', StartCamParam2, \
128, 10, 20, 0.7, 5, 100, RCoord2, CCoord2, \
StartPose2)
Rows2 := [Rows2,RCoord2]
Cols2 := [Cols2,CCoord2]
StartPoses2 := [StartPoses2,StartPose2]
endfor
* calibrate the stereo rig
binocular_calibration (X, Y, Z, Rows1, Cols1, Rows2, Cols2, StartCamParam1, \
StartCamParam2, StartPoses1, StartPoses2, 'all', \
CamParam1, CamParam2, NFinalPose1, NFinalPose2, \
RelPose, Errors)
* archive the results
write_cam_par (CamParam1, 'cam_left-125.dat')
write_cam_par (CamParam2, 'cam_right-125.dat')
write_pose (RelPose, 'rel_pose.dat')
* rectify the stereo images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1,'geometric', 'bilinear', CamParamRect1, CamParamRect2, Cam1PoseRect1, \
Cam2PoseRect2, RelPoseRect)
map_image (Image1, Map1, ImageMapped1)
map_image (Image2, Map2, ImageMapped2)
* open image source
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_l.seq', 'default', 0, -1, AcqHandle1)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_r.seq', 'default', 1, -1, AcqHandle2)
* initialize the start parameters
create_caltab (0.03, 'caltab_30.descr', 'caltab_30.ps')
caltab_points ('caltab_30.descr', X, Y, Z)
StartCamParam1 := [0.0125, 0, 7.4e-6, 7.4e-6, Width/2.0, Height/2.0, \
Width, Height]
StartCamParam2 := StartCamParam1
Rows1 := []
Cols1 := []
StartPoses1 := []
Rows2 := []
Cols2 := []
StartPoses2 := []
* find calibration marks and startposes
for i := 0 to 11 by 1
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
find_caltab (Image1, Caltab1, 'caltab_30.descr', 3, 120, 5)
find_caltab (Image2, Caltab2, 'caltab_30.descr', 3, 120, 5)
find_marks_and_pose (Image1, Caltab1, 'caltab_30.descr', StartCamParam1, \
128, 10, 20, 0.7, 5, 100, RCoord1, CCoord1, \
StartPose1)
Rows1 := [Rows1,RCoord1]
Cols1 := [Cols1,CCoord1]
StartPoses1 := [StartPoses1,StartPose1]
find_marks_and_pose (Image2, Caltab2, 'caltab_30.descr', StartCamParam2, \
128, 10, 20, 0.7, 5, 100, RCoord2, CCoord2, \
StartPose2)
Rows2 := [Rows2,RCoord2]
Cols2 := [Cols2,CCoord2]
StartPoses2 := [StartPoses2,StartPose2]
endfor
* calibrate the stereo rig
binocular_calibration (X, Y, Z, Rows1, Cols1, Rows2, Cols2, StartCamParam1, \
StartCamParam2, StartPoses1, StartPoses2, 'all', \
CamParam1, CamParam2, NFinalPose1, NFinalPose2, \
RelPose, Errors)
* archive the results
write_cam_par (CamParam1, 'cam_left-125.dat')
write_cam_par (CamParam2, 'cam_right-125.dat')
write_pose (RelPose, 'rel_pose.dat')
* rectify the stereo images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1,'geometric', 'bilinear', CamParamRect1, CamParamRect2, Cam1PoseRect1, \
Cam2PoseRect2, RelPoseRect)
map_image (Image1, Map1, ImageMapped1)
map_image (Image2, Map2, ImageMapped2)
HTuple AcqHandle1, AcqHandle2;
HTuple X, Y, Z, StartCamParam1, StartCamParam2;
HTuple Rows1, Cols1, StartPoses1, Rows2, Cols2, StartPoses2;
HTuple i, RCoord1, CCoord1, StartPose1, RCoord2, CCoord2;
HTuple StartPose2, CamParam1, CamParam2, NFinalPose1, NFinalPose2;
HTuple c1Pc2, Errors, CamParamRect1, CamParamRect2, CamPoseRect1;
HTuple CamPoseRect2, RelPoseRect;
Hobject Image1, Image2, Caltab1, Caltab2, Map1, Map2, ImageMapped1;
Hobject ImageMapped2;
// open image source
open_framegrabber("File",1,1,0,0,0,0,"default",-1,"default",-1,"default",
"images_l.seq","default",0,-1,&AcqHandle1);
open_framegrabber("File",1,1,0,0,0,0,"default",-1,"default",-1,"default",
"images_r.seq","default",0,-1,&AcqHandle2);
// initialize the start parameters
caltab_points("caltab_30mm.descr",&X,&Y,&Z);
StartCamParam1[7] = 640; // ImageHeight
StartCamParam1[6] = 480; // ImageWidth
StartCamParam1[5] = 320; // Cy
StartCamParam1[4] = 240; // Cx
StartCamParam1[3] = 7.4e-6; // Sy
StartCamParam1[2] = 7.4e-6; // Sx
StartCamParam1[1] = 0.0; // Kappa
StartCamParam1[0] = 0.0125; // Focus
StartCamParam2 = StartCamParam1; // identic camera
Rows1 = HTuple();
Cols1 = HTuple();
StartPoses1 = HTuple();
Rows2 = HTuple();
Cols2 = HTuple();
StartPoses2 = HTuple();
// find calibration marks and startposes
for (i=0; i<=11; i+=1)
{
grab_image_async(&Image1,AcqHandle1,-1);
grab_image_async(&Image2,AcqHandle2,-1);
find_caltab(Image1,&Caltab1,"caltab_30mm.descr",3,120,5);
find_caltab(Image2,&Caltab2,"caltab_30mm.descr",3,120,5);
find_marks_and_pose(Image1,Caltab1,"caltab_30.descr",StartCamParam1,128,
10,20,0.7,5,100,&RCoord1,&CCoord1,&StartPose1);
Rows1.Append(RCoord1);
Cols1.Append(CCoord1);
StartPoses1.Append(StartPose1);
find_marks_and_pose(Image2,Caltab2,"caltab_30mm.descr",StartCamParam2,128,
10,18,0.7,2,100,&RCoord2,&CCoord2,&StartPose2);
Rows2.Append(RCoord2);
Cols2.Append(CCoord2);
StartPoses2.Append(StartPose2);
}
// find calibration marks and start poses
binocular_calibration(X,Y,Z,Rows1,Cols1,Rows2,Cols2,StartCamParam1,
StartCamParam2,StartPoses1,StartPoses2,"all",
&CamParam1,&CamParam2,&NFinalPose1,&NFinalPose2,
&RelPose,&Errors);
// archive the results
write_cam_par(CamParam1,"cam_left-125.dat");
write_cam_par(CamParam2,"cam_right-125.dat");
write_pose(RelPose,"rel_pose.dat");
// rectify the stereo images
gen_binocular_rectification_map(&Map1,&Map2,CamParam1,CamParam2,RelPose,1,
"geometric","bilinear",&CamParamRect1,
&CamParamRect2,&CamPoseRect1,
&CamPoseRect2,&RelPoseRect);
map_image(Image1,Map1,&ImageMapped1);
map_image(Image2,Map2,&ImageMapped2);
* open image source
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_l.seq', 'default', 0, -1, AcqHandle1)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_r.seq', 'default', 1, -1, AcqHandle2)
* initialize the start parameters
create_caltab (0.03, 'caltab_30.descr', 'caltab_30.ps')
caltab_points ('caltab_30.descr', X, Y, Z)
StartCamParam1 := [0.0125, 0, 7.4e-6, 7.4e-6, Width/2.0, Height/2.0, \
Width, Height]
StartCamParam2 := StartCamParam1
Rows1 := []
Cols1 := []
StartPoses1 := []
Rows2 := []
Cols2 := []
StartPoses2 := []
* find calibration marks and startposes
for i := 0 to 11 by 1
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
find_caltab (Image1, Caltab1, 'caltab_30.descr', 3, 120, 5)
find_caltab (Image2, Caltab2, 'caltab_30.descr', 3, 120, 5)
find_marks_and_pose (Image1, Caltab1, 'caltab_30.descr', StartCamParam1, \
128, 10, 20, 0.7, 5, 100, RCoord1, CCoord1, \
StartPose1)
Rows1 := [Rows1,RCoord1]
Cols1 := [Cols1,CCoord1]
StartPoses1 := [StartPoses1,StartPose1]
find_marks_and_pose (Image2, Caltab2, 'caltab_30.descr', StartCamParam2, \
128, 10, 20, 0.7, 5, 100, RCoord2, CCoord2, \
StartPose2)
Rows2 := [Rows2,RCoord2]
Cols2 := [Cols2,CCoord2]
StartPoses2 := [StartPoses2,StartPose2]
endfor
* calibrate the stereo rig
binocular_calibration (X, Y, Z, Rows1, Cols1, Rows2, Cols2, StartCamParam1, \
StartCamParam2, StartPoses1, StartPoses2, 'all', \
CamParam1, CamParam2, NFinalPose1, NFinalPose2, \
RelPose, Errors)
* archive the results
write_cam_par (CamParam1, 'cam_left-125.dat')
write_cam_par (CamParam2, 'cam_right-125.dat')
write_pose (RelPose, 'rel_pose.dat')
* rectify the stereo images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1,'geometric', 'bilinear', CamParamRect1, CamParamRect2, Cam1PoseRect1, \
Cam2PoseRect2, RelPoseRect)
map_image (Image1, Map1, ImageMapped1)
map_image (Image2, Map2, ImageMapped2)
* open image source
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_l.seq', 'default', 0, -1, AcqHandle1)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'images_r.seq', 'default', 1, -1, AcqHandle2)
* initialize the start parameters
create_caltab (0.03, 'caltab_30.descr', 'caltab_30.ps')
caltab_points ('caltab_30.descr', X, Y, Z)
StartCamParam1 := [0.0125, 0, 7.4e-6, 7.4e-6, Width/2.0, Height/2.0, \
Width, Height]
StartCamParam2 := StartCamParam1
Rows1 := []
Cols1 := []
StartPoses1 := []
Rows2 := []
Cols2 := []
StartPoses2 := []
* find calibration marks and startposes
for i := 0 to 11 by 1
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
find_caltab (Image1, Caltab1, 'caltab_30.descr', 3, 120, 5)
find_caltab (Image2, Caltab2, 'caltab_30.descr', 3, 120, 5)
find_marks_and_pose (Image1, Caltab1, 'caltab_30.descr', StartCamParam1, \
128, 10, 20, 0.7, 5, 100, RCoord1, CCoord1, \
StartPose1)
Rows1 := [Rows1,RCoord1]
Cols1 := [Cols1,CCoord1]
StartPoses1 := [StartPoses1,StartPose1]
find_marks_and_pose (Image2, Caltab2, 'caltab_30.descr', StartCamParam2, \
128, 10, 20, 0.7, 5, 100, RCoord2, CCoord2, \
StartPose2)
Rows2 := [Rows2,RCoord2]
Cols2 := [Cols2,CCoord2]
StartPoses2 := [StartPoses2,StartPose2]
endfor
* calibrate the stereo rig
binocular_calibration (X, Y, Z, Rows1, Cols1, Rows2, Cols2, StartCamParam1, \
StartCamParam2, StartPoses1, StartPoses2, 'all', \
CamParam1, CamParam2, NFinalPose1, NFinalPose2, \
RelPose, Errors)
* archive the results
write_cam_par (CamParam1, 'cam_left-125.dat')
write_cam_par (CamParam2, 'cam_right-125.dat')
write_pose (RelPose, 'rel_pose.dat')
* rectify the stereo images
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1,'geometric', 'bilinear', CamParamRect1, CamParamRect2, Cam1PoseRect1, \
Cam2PoseRect2, RelPoseRect)
map_image (Image1, Map1, ImageMapped1)
map_image (Image2, Map2, ImageMapped2)
Sind die Parameterwerte korrekt und konnten die gesuchten Parameter
durch das Bündelausgleichsverfahren bestimmt werden, dann liefert
binocular_calibrationbinocular_calibrationBinocularCalibrationbinocular_calibrationBinocularCalibrationBinocularCalibration den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine
Fehlerbehandlung durchgeführt.
find_marks_and_posefind_marks_and_poseFindMarksAndPosefind_marks_and_poseFindMarksAndPoseFindMarksAndPose,
caltab_pointscaltab_pointsCaltabPointscaltab_pointsCaltabPointsCaltabPoints,
read_cam_parread_cam_parReadCamParread_cam_parReadCamParReadCamPar
write_posewrite_poseWritePosewrite_poseWritePoseWritePose,
write_cam_parwrite_cam_parWriteCamParwrite_cam_parWriteCamParWriteCamPar,
pose_to_hom_mat3dpose_to_hom_mat3dPoseToHomMat3dpose_to_hom_mat3dPoseToHomMat3dPoseToHomMat3d,
disp_caltabdisp_caltabDispCaltabdisp_caltabDispCaltabDispCaltab,
gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMap
find_caltabfind_caltabFindCaltabfind_caltabFindCaltabFindCaltab,
sim_caltabsim_caltabSimCaltabsim_caltabSimCaltabSimCaltab,
read_cam_parread_cam_parReadCamParread_cam_parReadCamParReadCamPar,
create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose,
convert_pose_typeconvert_pose_typeConvertPoseTypeconvert_pose_typeConvertPoseTypeConvertPoseType,
read_poseread_poseReadPoseread_poseReadPoseReadPose,
hom_mat3d_to_posehom_mat3d_to_poseHomMat3dToPosehom_mat3d_to_poseHomMat3dToPoseHomMat3dToPose,
create_caltabcreate_caltabCreateCaltabcreate_caltabCreateCaltabCreateCaltab,
binocular_disparitybinocular_disparityBinocularDisparitybinocular_disparityBinocularDisparityBinocularDisparity,
binocular_distancebinocular_distanceBinocularDistancebinocular_distanceBinocularDistanceBinocularDistance
3D Metrology