camera_calibrationT_camera_calibrationCameraCalibrationCameraCalibrationcamera_calibration相机标定(算子)

名称

camera_calibrationT_camera_calibrationCameraCalibrationCameraCalibrationcamera_calibration — 通过同时最小化过程确定所有相机参数。

签名

camera_calibration( : : NX, NY, NZ, NRow, NCol, StartCamParam, NStartPose, EstimateParams : CameraParam, NFinalPose, Errors)

Herror T_camera_calibration(const Htuple NX, const Htuple NY, const Htuple NZ, const Htuple NRow, const Htuple NCol, const Htuple StartCamParam, const Htuple NStartPose, const Htuple EstimateParams, Htuple* CameraParam, Htuple* NFinalPose, Htuple* Errors)

void CameraCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow, const HTuple& NCol, const HTuple& StartCamParam, const HTuple& NStartPose, const HTuple& EstimateParams, HTuple* CameraParam, HTuple* NFinalPose, HTuple* Errors)

HCamPar HCamPar::CameraCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow, const HTuple& NCol, const HPoseArray& NStartPose, const HTuple& EstimateParams, HPoseArray* NFinalPose, HTuple* Errors) const

HCamPar HCamPar::CameraCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow, const HTuple& NCol, const HPose& NStartPose, const HTuple& EstimateParams, HPose* NFinalPose, double* Errors) const

static HCamPar HPose::CameraCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow, const HTuple& NCol, const HCamPar& StartCamParam, const HPoseArray& NStartPose, const HTuple& EstimateParams, HPoseArray* NFinalPose, HTuple* Errors)

HCamPar HPose::CameraCalibration(const HTuple& NX, const HTuple& NY, const HTuple& NZ, const HTuple& NRow, const HTuple& NCol, const HCamPar& StartCamParam, const HTuple& EstimateParams, HPose* NFinalPose, double* Errors) const

static void HOperatorSet.CameraCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow, HTuple NCol, HTuple startCamParam, HTuple NStartPose, HTuple estimateParams, out HTuple cameraParam, out HTuple NFinalPose, out HTuple errors)

HCamPar HCamPar.CameraCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow, HTuple NCol, HPose[] NStartPose, HTuple estimateParams, out HPose[] NFinalPose, out HTuple errors)

HCamPar HCamPar.CameraCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow, HTuple NCol, HPose NStartPose, HTuple estimateParams, out HPose NFinalPose, out double errors)

static HCamPar HPose.CameraCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow, HTuple NCol, HCamPar startCamParam, HPose[] NStartPose, HTuple estimateParams, out HPose[] NFinalPose, out HTuple errors)

HCamPar HPose.CameraCalibration(HTuple NX, HTuple NY, HTuple NZ, HTuple NRow, HTuple NCol, HCamPar startCamParam, HTuple estimateParams, out HPose NFinalPose, out double errors)

def camera_calibration(nx: Sequence[Union[float, int]], ny: Sequence[Union[float, int]], nz: Sequence[Union[float, int]], nrow: Sequence[Union[float, int]], ncol: Sequence[Union[float, int]], start_cam_param: Sequence[Union[float, int, str]], nstart_pose: Sequence[Union[float, int]], estimate_params: Sequence[str]) -> Tuple[Sequence[Union[float, int, str]], Sequence[Union[float, int]], Sequence[float]]

def camera_calibration_s(nx: Sequence[Union[float, int]], ny: Sequence[Union[float, int]], nz: Sequence[Union[float, int]], nrow: Sequence[Union[float, int]], ncol: Sequence[Union[float, int]], start_cam_param: Sequence[Union[float, int, str]], nstart_pose: Sequence[Union[float, int]], estimate_params: Sequence[str]) -> Tuple[Sequence[Union[float, int, str]], Sequence[Union[float, int]], float]

描述

camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 单个相机的标定。为此,将已知的三维模型点(坐标为 NXNXNXNXNXnxNYNYNYNYNYnyNZNZNZNZNZnz)投影到图像中,并使投影的三维坐标与其对应图像点坐标(NRowNRowNRowNRowNRownrowNColNColNColNColNColncol)之间的距离平方和最小化。

最小化过程的初始值采用外部(NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose)和内部(StartCamParamStartCamParamStartCamParamStartCamParamstartCamParamstart_cam_param)相机参数。其中 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose 是有序元组,包含所有外部相机参数的初始值,以 形式给出,其中 ccs 表示相机坐标系,wcs 表示世界坐标系(参见 变换 / 姿态“解决方案指南 III-C - 三维视觉”)。可通过 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 显式将特定相机参数纳入或排除于最小化过程。有关可用相机模型、不同内部参数集及设置通用要求的详细说明,请参阅标定 一章。

要成功完成标定,至少需要一个具有精确已知度量属性的标定对象,例如 HALCON 标定板。在调用 camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 之前,请以不同角度拍摄一系列标定对象的图像,并确保覆盖整个视场或测量体积。标定的成功与否高度依赖于标定对象和图像的质量,因此在采集标定图像时需格外谨慎。更多细节请参阅 标定 一章中的“如何拍摄一组合适的图像?”部分。

标定成功后,camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 将返回相机的优化内部参数(CameraParamCameraParamCameraParamCameraParamcameraParamcamera_param)和外部参数(NFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPosenfinal_pose )。此外,优化结果的后投影均方根误差(RMSE)将以像素为单位存储在 ErrorsErrorsErrorsErrorserrorserrors 参数中。该误差值可作为优化是否成功的通用指标。

标定过程的预处理

如何提取图像中的标定标记?

若使用 HALCON 标定板,可通过 find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 算子确定每帧图像中标定标记的坐标,并计算外部相机参数的粗略估计值。对于采用矩形排列标记的 HALCON 标定板(参见 gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab),结合使用 find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltabfind_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose 两个算子可实现相同效果。两种情况下,由此获得的数值均可直接作为外部相机参数的初始值(NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose)。

显然,对于那些标定板分割(find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab)失败或标定标记未能通过 find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_posefind_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 成功识别的图像,均不应使用。

如何获取标定所需的初始值?

若使用 HALCON 标定板,输入参数 NXNXNXNXNXnxNYNYNYNYNYnyNZNZNZNZNZnz 存储在标定板的描述文件中。可通过调用算子 caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points 轻松获取这些参数。相机内部参数的初始值(StartCamParamStartCamParamStartCamParamStartCamParamstartCamParamstart_cam_param)可从所用相机的规格参数中获取。更多信息请参阅 标定。标定板初始姿态及标定标记坐标 NRowNRowNRowNRowNRownrowNColNColNColNColNColncol 可通过 find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 算子计算获得。元组 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose 由所有姿态拼接而成。

哪些相机参数待估算?

输入参数 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 用于选择要估计的相机参数。通常,该参数设置为 'all'"all""all""all""all""all",即确定所有6个外部相机参数(平移和旋转)以及所有内部相机参数。如果相机内部参数已确定(例如通过先前对 camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 的调用),通常只需确定世界坐标系在相机坐标系中的姿态(即相机外部参数)。在此情况下,可将 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 设置为 'pose'"pose""pose""pose""pose""pose"。这与 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params = ['alpha','beta','gamma','transx','transy','transz']["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"] 具有相同效果。此外,EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 包含一个字符串元组,用于指定待估计参数的组合。此外,可通过前缀 ~ 排除参数的估计。例如,值 ['pose','~transx']["pose","~transx"]["pose","~transx"]["pose","~transx"]["pose","~transx"]["pose","~transx"]['alpha','beta','gamma','transy','transz']["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"] 具有相同效果。另一个示例中,['all','~focus']["all","~focus"]["all","~focus"]["all","~focus"]["all","~focus"]["all","~focus"] 表示除焦点参数外的所有内部和外部参数。除 'all'"all""all""all""all""all" 外,所有参数值均可使用前缀 ~ 进行排除。

在确定相机参数时存在哪些限制?

有关确定相机参数时的一般限制的更多信息,请参阅 标定 一章中的“与特定相机类型相关的其他限制”部分。

各个参数内部的顺序是什么?

元组 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose 的长度取决于标定图像的数量,例如使用 15 张图像时,元组 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose 的长度为 (即 15 张图像乘以 7 个外部相机参数)。前 7 个值对应第一张图像中标定板的姿态,后 7 个值对应第二张图像中的姿态,依此类推。

该固定数量的标定图像必须在包含三维模型标记坐标与提取的二维标记的元组中予以考虑。若使用 15 张图像,元组 NRowNRowNRowNRowNRownrowNColNColNColNColNColncol 的长度为三维模型标记坐标元组(NXNXNXNXNXnxNYNYNYNYNYnyNZNZNZNZNZnz)长度的 15 倍。若每张图像包含 49 个标记点,则元组 NRowNRowNRowNRowNRownrowNColNColNColNColNColncol 的长度为 ,而元组 NXNXNXNXNXnxNYNYNYNYNYnyNZNZNZNZNZnz 的长度均为 49。NRowNRowNRowNRowNRownrowNColNColNColNColNColncol 中值的排列顺序为“图像依次排列”,即使用 49 个标记点时,首个三维模型点对应第 1、50、99、148、197、246 等提取的二维标记点。

输出参数的含义是什么?

若相机标定过程成功完成,输出参数 CameraParamCameraParamCameraParamCameraParamcameraParamcamera_paramNFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPosenfinal_pose 将分别包含调整后的相机内部参数与外部参数值。元组 NFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPosenfinal_pose 的长度与元组 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose 的长度相匹配。

NFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPosenfinal_pose 的表示类型对应于 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose(参见 create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose)中第一个元组的表示类型。可通过 convert_pose_typeconvert_pose_typeConvertPoseTypeConvertPoseTypeConvertPoseTypeconvert_pose_type 进行表示类型转换。

作为附加参数,优化过程的反向投影将返回均方根误差(RMSE)(ErrorsErrorsErrorsErrorserrorserrors)。该参数反映了标定的精度。误差值(位置的均方根误差)以像素为单位测量。若仅校准单台相机,误差值约为 0.1 像素(通过提取投影标定标记坐标获得的典型检测误差)表明优化结果与观测数据吻合良好。若 ErrorsErrorsErrorsErrorserrorserrors 值显著偏离 0.1 像素,则表明标定效果不佳。可能原因包括:图像质量欠佳、标定图像数量不足或标定板精度不足。

我必须使用平面标定对象吗?

不。camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 算子的设计使得输入元组 NXNXNXNXNXnxNYNYNYNYNYnyNZNZNZNZNZnzNRowNRowNRowNRowNRownrowNColNColNColNColNColncol 可包含任意三维/二维对应关系。单个参数的顺序在“各个参数内部的顺序是什么?”段落中有详细说明。

因此,所需的三维模型标记与对应的二维标记如何确定并不重要。一方面,可以使用三维标定对象;另一方面,也可以使用任何具有已知空间位置特征点(例如自然地标)。通过将 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 设置为 'pose'"pose""pose""pose""pose""pose",即可计算对象在相机坐标系中的姿态!为此至少需要三个三维/二维对应点作为输入。例如可参照 create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose 程序示例,直接生成初始姿态参数 NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose

注意

标定的最小化过程取决于内部(StartCamParamStartCamParamStartCamParamStartCamParamstartCamParamstart_cam_param)和外部(NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose)相机参数的初始值。计算出的平均误差 ErrorsErrorsErrorsErrorserrorserrors 可反映标定的精度。误差(x 和 y 坐标的偏差)以像素为单位进行测量。

对于线扫描相机,可将内部相机参数 Sy 的起始值设置为 0.0。此时无法确定主点在 y 方向上的位置。因此,EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 必须包含项 '~cy'"~cy""~cy""~cy""~cy""~cy"。此时主点到传感器线的有效距离始终为 。更多信息请参阅 标定 一章中“特定相机类型的其他限制”部分。

执行信息

参数

NXNXNXNXNXnx (输入控制)  number-array HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

标定标记所有 x 坐标(单位:米)的有序元组。

NYNYNYNYNYny (输入控制)  number-array HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

标定标记所有 y 坐标(单位:米)的有序元组。

元素数量: NY == NX

NZNZNZNZNZnz (输入控制)  number-array HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

标定标记所有 z 坐标(单位:米)的有序元组。

元素数量: NZ == NX

NRowNRowNRowNRowNRownrow (输入控制)  number-array HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

包含所有提取标定标记行坐标(单位:像素)的有序元组。

NColNColNColNColNColncol (输入控制)  number-array HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

包含所有提取标定标记列坐标(单位:像素)的有序元组。

元素数量: NCol == NRow

StartCamParamStartCamParamStartCamParamStartCamParamstartCamParamstart_cam_param (输入控制)  campar HCamPar, HTupleSequence[Union[float, int, str]]HTupleHtuple (real / integer / string) (double / int / long / string) (double / Hlong / HString) (double / Hlong / char*)

内部相机参数的初始值。

NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose (输入控制)  pose(-array) HPose, HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

包含外部相机参数所有初始值的有序元组。

元素数量: NStartPose == 7 * NRow / NX

EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params (输入控制)  string-array HTupleSequence[str]HTupleHtuple (string) (string) (HString) (char*)

待估算的相机参数。

默认值: 'all' "all" "all" "all" "all" "all"

值列表: 'all'"all""all""all""all""all", 'alpha'"alpha""alpha""alpha""alpha""alpha", 'beta'"beta""beta""beta""beta""beta", 'camera'"camera""camera""camera""camera""camera", 'cx'"cx""cx""cx""cx""cx", 'cy'"cy""cy""cy""cy""cy", 'focus'"focus""focus""focus""focus""focus", 'gamma'"gamma""gamma""gamma""gamma""gamma", 'image_plane_dist'"image_plane_dist""image_plane_dist""image_plane_dist""image_plane_dist""image_plane_dist", 'k1'"k1""k1""k1""k1""k1", 'k2'"k2""k2""k2""k2""k2", 'k3'"k3""k3""k3""k3""k3", 'kappa'"kappa""kappa""kappa""kappa""kappa", 'magnification'"magnification""magnification""magnification""magnification""magnification", 'poly'"poly""poly""poly""poly""poly", 'poly_tan_2'"poly_tan_2""poly_tan_2""poly_tan_2""poly_tan_2""poly_tan_2", 'pose'"pose""pose""pose""pose""pose", 'sx'"sx""sx""sx""sx""sx", 'sy'"sy""sy""sy""sy""sy", 'tilt'"tilt""tilt""tilt""tilt""tilt", 'transx'"transx""transx""transx""transx""transx", 'transy'"transy""transy""transy""transy""transy", 'transz'"transz""transz""transz""transz""transz", 'vx'"vx""vx""vx""vx""vx", 'vy'"vy""vy""vy""vy""vy", 'vz'"vz""vz""vz""vz""vz"

CameraParamCameraParamCameraParamCameraParamcameraParamcamera_param (输出控制)  campar HCamPar, HTupleSequence[Union[float, int, str]]HTupleHtuple (real / integer / string) (double / int / long / string) (double / Hlong / HString) (double / Hlong / char*)

内部相机参数。

NFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPosenfinal_pose (输出控制)  pose(-array) HPose, HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

包含所有外部相机参数的有序元组。

元素数量: NFinalPose == 7 * NRow / NX

ErrorsErrorsErrorsErrorserrorserrors (输出控制)  real(-array) HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

平均误差距离(单位:像素)。

示例(HDevelop)

* Read calibration images.
read_image(Image1, 'calib/grid_space.cal.k.000')
read_image(Image2, 'calib/grid_space.cal.k.001')
read_image(Image3, 'calib/grid_space.cal.k.002')
*  Find calibration pattern.
find_caltab(Image1, CalPlate1, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image2, CalPlate2, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image3, CalPlate3, 'caltab_big.descr', 3, 112, 5)
*  Find calibration marks and start poses.
StartCamPar := ['area_scan_division', 0.008, 0.0, 0.000011, 0.000011, \
                384, 288, 768, 576]
find_marks_and_pose(Image1, CalPlate1, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
                    StartPose1)
find_marks_and_pose(Image2, CalPlate2, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
                    StartPose2)
find_marks_and_pose(Image3, CalPlate3, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
                    StartPose3)
*  Read 3D positions of calibration marks.
caltab_points('caltab_big.descr', NX, NY, NZ)
*  Camera calibration.
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
                   [CCoord1, CCoord2, CCoord3], StartCamPar, \
                   [StartPose1, StartPose2, StartPose3], 'all', \
                   CameraParam, NFinalPose, Errors)
*  Write internal camera parameters to file.
write_cam_par(CameraParam, 'campar.dat')

示例(HDevelop)

* Read calibration images.
read_image(Image1, 'calib/grid_space.cal.k.000')
read_image(Image2, 'calib/grid_space.cal.k.001')
read_image(Image3, 'calib/grid_space.cal.k.002')
*  Find calibration pattern.
find_caltab(Image1, CalPlate1, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image2, CalPlate2, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image3, CalPlate3, 'caltab_big.descr', 3, 112, 5)
*  Find calibration marks and start poses.
StartCamPar := ['area_scan_division', 0.008, 0.0, 0.000011, 0.000011, \
                384, 288, 768, 576]
find_marks_and_pose(Image1, CalPlate1, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
                    StartPose1)
find_marks_and_pose(Image2, CalPlate2, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
                    StartPose2)
find_marks_and_pose(Image3, CalPlate3, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
                    StartPose3)
*  Read 3D positions of calibration marks.
caltab_points('caltab_big.descr', NX, NY, NZ)
*  Camera calibration.
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
                   [CCoord1, CCoord2, CCoord3], StartCamPar, \
                   [StartPose1, StartPose2, StartPose3], 'all', \
                   CameraParam, NFinalPose, Errors)
*  Write internal camera parameters to file.
write_cam_par(CameraParam, 'campar.dat')

示例(HDevelop)

* Read calibration images.
read_image(Image1, 'calib/grid_space.cal.k.000')
read_image(Image2, 'calib/grid_space.cal.k.001')
read_image(Image3, 'calib/grid_space.cal.k.002')
*  Find calibration pattern.
find_caltab(Image1, CalPlate1, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image2, CalPlate2, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image3, CalPlate3, 'caltab_big.descr', 3, 112, 5)
*  Find calibration marks and start poses.
StartCamPar := ['area_scan_division', 0.008, 0.0, 0.000011, 0.000011, \
                384, 288, 768, 576]
find_marks_and_pose(Image1, CalPlate1, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
                    StartPose1)
find_marks_and_pose(Image2, CalPlate2, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
                    StartPose2)
find_marks_and_pose(Image3, CalPlate3, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
                    StartPose3)
*  Read 3D positions of calibration marks.
caltab_points('caltab_big.descr', NX, NY, NZ)
*  Camera calibration.
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
                   [CCoord1, CCoord2, CCoord3], StartCamPar, \
                   [StartPose1, StartPose2, StartPose3], 'all', \
                   CameraParam, NFinalPose, Errors)
*  Write internal camera parameters to file.
write_cam_par(CameraParam, 'campar.dat')

示例(HDevelop)

* Read calibration images.
read_image(Image1, 'calib/grid_space.cal.k.000')
read_image(Image2, 'calib/grid_space.cal.k.001')
read_image(Image3, 'calib/grid_space.cal.k.002')
*  Find calibration pattern.
find_caltab(Image1, CalPlate1, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image2, CalPlate2, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image3, CalPlate3, 'caltab_big.descr', 3, 112, 5)
*  Find calibration marks and start poses.
StartCamPar := ['area_scan_division', 0.008, 0.0, 0.000011, 0.000011, \
                384, 288, 768, 576]
find_marks_and_pose(Image1, CalPlate1, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
                    StartPose1)
find_marks_and_pose(Image2, CalPlate2, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
                    StartPose2)
find_marks_and_pose(Image3, CalPlate3, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
                    StartPose3)
*  Read 3D positions of calibration marks.
caltab_points('caltab_big.descr', NX, NY, NZ)
*  Camera calibration.
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
                   [CCoord1, CCoord2, CCoord3], StartCamPar, \
                   [StartPose1, StartPose2, StartPose3], 'all', \
                   CameraParam, NFinalPose, Errors)
*  Write internal camera parameters to file.
write_cam_par(CameraParam, 'campar.dat')

示例(HDevelop)

* Read calibration images.
read_image(Image1, 'calib/grid_space.cal.k.000')
read_image(Image2, 'calib/grid_space.cal.k.001')
read_image(Image3, 'calib/grid_space.cal.k.002')
*  Find calibration pattern.
find_caltab(Image1, CalPlate1, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image2, CalPlate2, 'caltab_big.descr', 3, 112, 5)
find_caltab(Image3, CalPlate3, 'caltab_big.descr', 3, 112, 5)
*  Find calibration marks and start poses.
StartCamPar := ['area_scan_division', 0.008, 0.0, 0.000011, 0.000011, \
                384, 288, 768, 576]
find_marks_and_pose(Image1, CalPlate1, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
                    StartPose1)
find_marks_and_pose(Image2, CalPlate2, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
                    StartPose2)
find_marks_and_pose(Image3, CalPlate3, 'caltab_big.descr', StartCamPar, \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
                    StartPose3)
*  Read 3D positions of calibration marks.
caltab_points('caltab_big.descr', NX, NY, NZ)
*  Camera calibration.
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
                   [CCoord1, CCoord2, CCoord3], StartCamPar, \
                   [StartPose1, StartPose2, StartPose3], 'all', \
                   CameraParam, NFinalPose, Errors)
*  Write internal camera parameters to file.
write_cam_par(CameraParam, 'campar.dat')

结果

camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 返回 2 (H_MSG_TRUE) 表示所有参数值均正确,且最小化算法已成功确定所需相机参数。如有必要,则抛出异常。

可能的前趋

find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose, caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points, read_cam_parread_cam_parReadCamParReadCamParReadCamParread_cam_par

可能的后继

write_posewrite_poseWritePoseWritePoseWritePosewrite_pose, pose_to_hom_mat3dpose_to_hom_mat3dPoseToHomMat3dPoseToHomMat3dPoseToHomMat3dpose_to_hom_mat3d, disp_caltabdisp_caltabDispCaltabDispCaltabDispCaltabdisp_caltab, sim_caltabsim_caltabSimCaltabSimCaltabSimCaltabsim_caltab

替代

calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras

另见

find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab, find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose, disp_caltabdisp_caltabDispCaltabDispCaltabDispCaltabdisp_caltab, sim_caltabsim_caltabSimCaltabSimCaltabSimCaltabsim_caltab, write_cam_parwrite_cam_parWriteCamParWriteCamParWriteCamParwrite_cam_par, read_cam_parread_cam_parReadCamParReadCamParReadCamParread_cam_par, create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose, convert_pose_typeconvert_pose_typeConvertPoseTypeConvertPoseTypeConvertPoseTypeconvert_pose_type, write_posewrite_poseWritePoseWritePoseWritePosewrite_pose, read_poseread_poseReadPoseReadPoseReadPoseread_pose, pose_to_hom_mat3dpose_to_hom_mat3dPoseToHomMat3dPoseToHomMat3dPoseToHomMat3dpose_to_hom_mat3d, hom_mat3d_to_posehom_mat3d_to_poseHomMat3dToPoseHomMat3dToPoseHomMat3dToPosehom_mat3d_to_pose, caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points, gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab, calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras

模块

标定