标定
节列表 ↓
本章提供有关相机标定的信息。
总体目标
要使相机设置达到最高测量精度,必须进行相应的校准。因此,需要确定相机模型,该模型描述了三维世界点在图像中投影到(子)像素的过程。
HALCON 提供多种算子,用于处理与标定相关的各类任务,例如:
本章针对获取相机内部和外部参数的基本概念提供指导。以下段落阐述如何成功校准相机,特别描述了:
标定对象
要成功标定相机设置,至少需要一个具有精确已知度量属性的标定对象,例如 HALCON 标定板。标定时需拍摄一系列不同位置和方向的标定目标图像。标定的成功与否高度依赖于标定对象和图像的质量,因此在采集标定图像时需格外谨慎。更多信息请参阅“如何拍摄一组合适的图像?”一节。
标定板上覆盖着多个标定标记,这些标记在标定图像中被提取出来以获取其坐标。标定板的方位必须明确已知,因此查找器图案也是印记的一部分。
您的经销商可为您提供两种不同类型的标准 HALCON 标定板:
- 带有六边形排列标记的标定板:
-
作为查找器图案,存在特殊标记六边形组,其中部分标记包含点状孔洞(参见 create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltabcreate_caltab)。至少需要一个定位标记可见才能找到标定板。为确保标定板未倒置,至少需观察到第二个标记,但标定板在图像中不必完全可见。坐标系原点位于首个查找器图案中心标记的中心。坐标系的 z 轴指向标定板内部,x 轴指向右侧,y 轴指向下方,视线方向沿 z 轴延伸。
当使用 camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration 替代
calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 时,此标定板不适用。
- 带有矩形排列标记的标定板:
-
查找器图案由周边框架和三角形角标记组成(参见 gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab)。因此,标定板必须在图像中完全可见。坐标原点位于标定板表面的中心位置。坐标系的 z 轴指向标定板内部,x 轴指向右侧,y 轴指向下方,视线方向沿 z 轴延伸。
在获取标定图像时,请注意根据所使用的标定板,拍摄方式存在不同建议(参见“如何拍摄一组合适的图像?”一节)。
准备标定输入数据
在调用标定算子(例如 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras)之前,您必须通过以下步骤创建并适配标定数据模型:
-
使用算子
create_calib_datacreate_calib_dataCreateCalibDataCreateCalibDataCreateCalibDatacreate_calib_data 创建标定数据模型,指定设置中的相机数量和使用的标定对象数量。
-
使用算子
set_calib_data_cam_paramset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParamSetCalibDataCamParamset_calib_data_cam_param 指定相机类型和初始内部相机参数。
-
使用算子 set_calib_data_calib_objectset_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObjectSetCalibDataCalibObjectset_calib_data_calib_object 指定所有标定对象的描述。
-
使用算子
find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 或 set_calib_data_observ_pointsset_calib_data_observ_pointsSetCalibDataObservPointsSetCalibDataObservPointsSetCalibDataObservPointsset_calib_data_observ_points 收集观测数据,即获取标定对象中提取的标定标记的图像坐标,以及标定对象相对于观测相机的粗略估计姿态。
-
配置标定过程,例如将某些相机参数排除在优化之外。可通过算子
set_calib_dataset_calib_dataSetCalibDataSetCalibDataSetCalibDataset_calib_data 指定这些参数。例如,若相机 0 的图像传感器像素尺寸已精确知晓,仅需校准其余参数,则调用
set_calib_data(CalibDataID, 'camera', 0, 'excluded_settings', ['sx','sy'])set_calib_data(CalibDataID, "camera", 0, "excluded_settings", ["sx","sy"])SetCalibData(CalibDataID, "camera", 0, "excluded_settings", ["sx","sy"])SetCalibData(CalibDataID, "camera", 0, "excluded_settings", ["sx","sy"])SetCalibData(CalibDataID, "camera", 0, "excluded_settings", ["sx","sy"])set_calib_data(CalibDataID, "camera", 0, "excluded_settings", ["sx","sy"])。 |
执行实际相机标定并获取其结果
利用标定数据模型中存储的所有信息,可通过调用 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 执行实际标定。该过程通过优化初始内部相机参数、计算并添加外部相机参数或标准差等额外数据来修改输入模型。此外,系统还会计算校准后内部参数的标准差与协方差,以及反向投影的均方根误差,以验证标定是否成功。
最终结果可通过 get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibDataget_calib_data 算子进行查询。
检查标定是否成功
标定成功后,优化过程的反向投影均方根误差(RMSE)将以
ErrorErrorErrorErrorerrorerror(像素单位)形式返回。该误差值可作为优化成功与否的总体指标,因为它对应于反向投影标定点与其提取图像坐标之间的平均距离(像素单位)。
若仅校准单台相机,ErrorErrorErrorErrorerrorerror 约为 0.1 像素(通过提取投影标定标记坐标获得的典型检测误差)表明优化结果与观测数据吻合良好。当
ErrorErrorErrorErrorerrorerror 显著偏离 0.1 像素,则说明标定效果不佳。可能原因包括:图像质量欠佳、标定图像数量不足或标定板精度不足。
有关如何使用多视角相机设置检查标定是否成功的信息,请参阅 标定 /多视角 一章中中相应部分。
相机参数
关于相机参数,可区分内部参数与外部参数。
- 内部相机参数:
-
这些参数描述了所用相机的特性,特别是传感器本身的尺寸以及所用镜头、相机和帧抓取器组合的投影特性。以下是所有可用相机类型及其对应参数 CameraParam 的概述。列表中 “projective cameras” 投影相机指镜头在物镜侧执行透视投影的特性,而 “telecentric cameras” 远心相机则指镜头在物镜侧执行远心投影的特性。
- 面扫描相机(面阵相机)
-
根据相机类型,拥有9至16个内部参数。
出于下文所述原因,标有*星号的参数为固定参数,不会由算法进行估计。
- 带常规镜头的面扫描相机
-
带常规镜头的投影面扫描相机
-
'area_scan_division'"area_scan_division""area_scan_division""area_scan_division""area_scan_division""area_scan_division":['area_scan_division', Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx,
Cy, ImageWidth, ImageHeight]
-
'area_scan_polynomial'"area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial":['area_scan_polynomial', Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
带常规镜头的远心面扫描相机
-
'area_scan_telecentric_division'"area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division":['area_scan_telecentric_division', Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification,
Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
-
'area_scan_telecentric_polynomial'"area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial":['area_scan_telecentric_polynomial', Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification,
K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
- 带倾斜镜头的面扫描相机
-
带倾斜镜头的投影面扫描相机
-
'area_scan_tilt_division'"area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division":['area_scan_tilt_division', Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa,
ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
-
'area_scan_tilt_polynomial'"area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial":['area_scan_tilt_polynomial', Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1,
P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth,
ImageHeight]
-
'area_scan_tilt_image_side_telecentric_division'"area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division":['area_scan_tilt_image_side_telecentric_division',
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division",
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division",
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division",
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division",
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division",
Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]
-
'area_scan_tilt_image_side_telecentric_polynomial'"area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial":['area_scan_tilt_image_side_telecentric_polynomial',
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial",
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial",
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial",
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial",
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial",
Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]
带倾斜镜头的远心面扫描相机
-
'area_scan_tilt_bilateral_telecentric_division'"area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division":['area_scan_tilt_bilateral_telecentric_division',
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division",
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division",
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division",
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division",
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division",
Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy,
ImageWidth, ImageHeight]
-
'area_scan_tilt_bilateral_telecentric_polynomial'"area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial":['area_scan_tilt_bilateral_telecentric_polynomial',
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight]
-
'area_scan_tilt_object_side_telecentric_division'"area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division":['area_scan_tilt_object_side_telecentric_division',
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division",
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division",
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division",
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division",
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division",
Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]
-
'area_scan_tilt_object_side_telecentric_polynomial'"area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial":['area_scan_tilt_object_side_telecentric_polynomial',
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial",
Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt,
Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
- 带超中心镜头面扫描相机
-
带超中心镜头的投影面扫描相机
-
'area_scan_hypercentric_division'"area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division":['area_scan_hypercentric_division', Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*,
Cx, Cy, ImageWidth, ImageHeight]
-
'area_scan_hypercentric_polynomial'"area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial":['area_scan_hypercentric_polynomial', Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1,
P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]
- 面扫描相机内部参数说明:
-
- CameraType:
相机类型,如上所述。
- Focus:
-
镜头的焦距(仅适用于在镜头物镜侧执行透视投影的镜头)。
初始值为所用镜头的标称焦距,例如 0.008m。
- Magnification:
-
镜头的放大倍率(仅适用于在透镜物镜侧实现远心投影的镜头)。
初始值为所用远心镜头的名标称放大倍率(图像尺寸除以物体尺寸),例如 0.2。
- Kappa :
-
用于建模径向透镜畸变的畸变系数(仅适用于除法模型)。
使用 0.0 作为初始值。
- K1, K2, K3, P1, P2:
-
用于建模径向 和偏心 透镜畸变的畸变系数(仅适用于多项式模型)。
所有五个系数的初始值均设为 0.0。
- ImagePlaneDist:
镜头出瞳到像平面的距离。出瞳是指从镜头像侧观察到的光阑(通常为光圈)的(虚)像。典型值范围从几厘米到非常大的数值不等,具体取决于镜头是否接近成像侧远心。
- Tilt, Rot:
-
倾斜角 描述了光轴相对于传感器平面法线的倾斜角度(对应于围绕 x 轴的旋转)。旋转角 描述了围绕光轴(z 轴)的旋转。旋转角度 表示相对于相机外壳的光轴垂直向下倾斜, 表示光轴水平向左倾斜(沿 z 轴的视线方向), 表示光轴垂直向上倾斜,
表示光轴水平向右倾斜。
这些参数仅在相机配置中包含倾斜镜头时使用。
这些角度通常基于使用倾斜镜头的考量而大致可知,或可从镜头倾斜的机械结构中读取。
- Sx, Sy:
-
缩放系数。它们对应于传感器上两个相邻像素像元之间的水平和垂直距离。由于图像信号通常采用行同步采样方式,
由传感器尺寸决定,无需通过标定过程估算。
初始值取决于相机所用芯片的尺寸。具体数值请参阅相机技术规格说明书。注意:若对图像进行子采样,这些数值将增大!
由于 投影相机 通过针孔相机模型进行描述,因此无法同时确定
FocusFocusFocusFocusfocusfocus、 和 。因此,该算法将保持 固定。
对于 远心镜头,无法同时确定 Magnification、
和 。因此,该算法将保持 固定
对于 图像侧远心倾斜镜头(不同类型倾斜镜头的概述请参见“解决方案指南III-C 三维视觉”中“基础知识”一章的“相机模型与参数”部分),无法同时确定 FocusFocusFocusFocusfocusfocus、、 以及倾斜参数 和 。因此,除 外,算法将保持 固定。
对于 双侧远心倾斜镜头,无法同时确定 Magnification、、 以及倾斜参数 和 。因此,除 外,算法将保持 固定。
- Cx, Cy:
-
图像主点(径向畸变中心)的列坐标()和行坐标()。
使用图像宽度和高度的一半作为初始值。注意:若图像被降采样,这些值将减小!
- ImageWidth, Image Height:
采样图像的宽度和高度。注意:若图像被降采样,这些值将减小!
- 线扫描相机(线阵相机)
-
根据相机类型,拥有12 或16个内部参数。
出于下文所述原因,标有*星号的参数为固定参数,不会由算法进行估计。
- 带常规镜头的线扫描相机
-
带常规镜头的投影线扫描相机
-
'line_scan_division'"line_scan_division""line_scan_division""line_scan_division""line_scan_division""line_scan_division":['line_scan_division', Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_division", Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_division", Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_division", Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_division", Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_division", Focus, Kappa, Sx*, Sy*, Cx,
Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]
-
'line_scan_polynomial'"line_scan_polynomial""line_scan_polynomial""line_scan_polynomial""line_scan_polynomial""line_scan_polynomial":['line_scan_polynomial', Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan_polynomial", Focus, K1, K2, K3, P1, P2,
Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]
带常规镜头的远心线扫描相机
-
'line_scan_telecentric_division'"line_scan_telecentric_division""line_scan_telecentric_division""line_scan_telecentric_division""line_scan_telecentric_division""line_scan_telecentric_division":['line_scan_telecentric_division', Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_division", Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_division", Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_division", Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_division", Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_division", Magnification,
Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz*]
-
'line_scan_telecentric_polynomial'"line_scan_telecentric_polynomial""line_scan_telecentric_polynomial""line_scan_telecentric_polynomial""line_scan_telecentric_polynomial""line_scan_telecentric_polynomial":['line_scan_telecentric_polynomail', Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_polynomail", Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_polynomail", Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_polynomail", Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_polynomail", Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]["line_scan_telecentric_polynomail", Magnification,
K1, K2, K3, P1, P2, Sx*, Sy*, Cx, Cy, ImageWidth,
ImageHeight, Vx, Vy, Vz*]
- 线扫描相机内部参数说明:
-
- CameraType:
相机类型,如上所述。
- Focus:
-
镜头的焦距(仅适用于在镜头物镜侧执行透视投影的镜头)。
初始值是所用镜头的标称焦距,例如 0.008m。
- Magnification:
-
镜头的放大倍率(仅适用于在透镜物镜侧实现远心投影的镜头)。
初始值是所用远心镜头的标称放大倍率(图像尺寸除以物体尺寸),例如0.2。
- Kappa :
-
用于建模径向透镜畸变的畸变系数(仅适用于除法模型)。
使用 0.0 作为初始值。
- K1, K2, K3, P1, P2:
-
用于建模径向 和偏心 透镜畸变的畸变系数(仅适用于多项式模型)。
所有五个系数的初始值均设为 0.0。
- Sx:
缩放系数。对应传感器上两个相邻像素像元之间的水平距离。需注意,Focus 或
Magnification 与 值不可同时确定。因此在标定过程中将 固定不变。 的初始值可取自相机技术规格参数。注意:若图像进行子采样处理,该值将增大!
- Sy:
缩放系数。在标定过程中,其仅以 的形式出现。因此, 和 无法同时确定。故在标定时, 保持固定。 描述了像心点到传感器线的距离(单位:米)。 的初始值可取自相机的技术规格。注意:若图像进行子采样处理,该值将增大!
- Cx:
图像中心点(径向畸变中心)的列坐标。将图像宽度的一半作为 的初始值。注意:若对图像进行子采样,该值将降低!
- Cy:
图像中心点(径向畸变中心)到传感器线的距离(单位:扫描线)。初始值通常可设为 0。
- ImageWidth, ImageHeight:
采样图像的宽度和高度。注意:若图像被降采样,这些值将减小!
- Vx, Vy, Vz:
-
运动向量的 X、Y 和 Z 分量。
运动向量的 x、y 和 z 分量初始值取决于图像采集设置。假设相机垂直俯视传送带,并围绕其光轴旋转使传感器线与传送带垂直(即相机坐标系的 y 轴平行于传送带),则初始值设为 。此时可通过已知尺寸物体(如校准板、直尺)的线扫描图像确定 的初始值:
其中
如果相机相对于上述设置沿其光轴(即相机坐标系的z轴)旋转 30 度,则上述确定的初始值必须按以下方式调整:
如果相较于初始设置,相机围绕相机坐标系的 x 轴旋转 -20 度,则初始值如下:
初始值 、 和 的质量对整个标定的成功至关重要。若其精度不足,标定可能失败。
请注意,对于远心线扫描相机,
值不会影响三维点的图像位置,因此无法确定。因此,对于远心线扫描相机, 不会进行优化,而是保持其初始值。因此, 的初始值应设为 0。但在使用多个共享共同运动向量的远心线扫描相机时(详见 标定 / 多视角),可根据相机姿态确定
值。此时 将被优化。
- 内部相机参数限制
-
请注意焦距 focal length 这一术语并不完全准确,仅适用于物距为无穷远的情况。为简化表述,即使指代像距 image distance 时,也始终使用焦距 focal length 这一术语。
对于所有将相机参数作为输入的算子,其对应的参数值均需检查是否满足以下限制条件:
对于某些算子,限制条件略有不同。特别是对于不支持线扫描相机的算子,适用以下限制:
- 外部相机参数:
-
以下 6 个参数描述了三维姿态,即世界坐标系相对于相机坐标系的位置和方向。相机坐标系的 x 轴和 y 轴与图像的列轴和行轴平行,而 z 轴垂直于图像平面。对于线扫描相机,世界坐标系的姿态指的是第一图像行的相机坐标系。
- TransX:
相机坐标系 x 轴方向的平移。
- TransY:
相机坐标系 y 轴方向的平移。
- TransZ:
相机坐标系 z 轴方向的平移。
- RotX:
相机坐标系 x 轴方向的旋转。
- RotY:
相机坐标系 y 轴方向的旋转。
- RotZ:
相机坐标系 z 轴方向的旋转。
姿态元组还包含一个额外元素,即姿态的表示类型。该类型编码了参数 OrderOfTransformOrderOfTransformOrderOfTransformOrderOfTransformorderOfTransformorder_of_transform、OrderOfRotationOrderOfRotationOrderOfRotationOrderOfRotationorderOfRotationorder_of_rotation 和
ViewOfTransformViewOfTransformViewOfTransformViewOfTransformviewOfTransformview_of_transform 的组合。有关三维姿态的更多 信息,请参阅 create_posecreate_poseCreatePoseCreatePoseCreatePose。
使用标准 HALCON 标定板时,世界坐标系由标定板的坐标系定义。更多信息请参阅上文“标定目标”一节。
如果使用 HALCON 标定板,可通过
find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 算子确定所有参数的初始值。对于采用矩形排列标记的 HALCON 标定板,结合使用 find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
和 find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose 两个算子将产生相同效果。
- 参数单位:
-
HALCON 标定板采用米为单位。相机参数使用对应单位。当然,标定可采用不同单位进行,但此时相关参数需相应调整。此处列出 HALCON 对不同相机参数的默认单位:
|
|
参数 |
单位 |
|
外部 |
RotX, RotY, RotZ
|
, ,
|
|
|
TransX, TransY, TransZ
|
, ,
|
|
内部 |
Cx, Cy |
,
|
|
|
Focus |
|
|
|
ImagePlaneDist |
|
|
|
ImageWidth, ImageHeight |
,
|
|
|
K1, K2, K3
|
, ,
|
|
|
Kappa |
|
|
|
P1, P2 |
,
|
|
|
Magnification |
- (scalar) |
|
|
Sx, Sy |
,
|
|
|
Tilt, Rot |
,
|
|
|
Vx, Vy, Vz
|
,
,
|
关于标定过程的补充信息
使用 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 会引发一些问题,这些问题将在以下部分进行说明:
- 如何获取合适的标定板?
-
您可通过当地经销商获取多种尺寸和材质的高精度标定板。这些标定板附带对应的描述文件,可通过 find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 算子轻松提取。
也可使用任意物体进行标定。唯一要求是该物体需具备可在图像中可靠检测的特征点,且这些点的三维空间位置需具备高精度已知值。详情请参阅 “解决方案指南 III-C 三维视觉”。
自行打印的标定物通常不够精确,无法满足高精度应用的需求。
- 如何拍摄一组合适的照片?
-
在镜头(固定焦距设置!)、相机和帧抓取器组合需要校准的情况下,必须拍摄标定板的一组图像(参见
open_framegrabberopen_framegrabberOpenFramegrabberOpenFramegrabberOpenFramegrabberopen_framegrabber 和 grab_imagegrab_imageGrabImageGrabImageGrabImagegrab_image)。
您的本地经销商可提供两种标准 HALCON 标定板:六边形排列标记的标定板(参见 create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltabcreate_caltab)和矩形排列标记的标定板(参见 gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab)。由于这两种标定板存在显著差异,某些情况下需遵循额外特殊要求(详见下文)。
在拍摄标定图像时,应考虑以下参数和提示。为确保标定成功,拍摄设置及所用图像集需具备特定品质。这些品质可能因具体任务和需求而异。为提供指导,本文列举了适用于基础单目相机设置的参数值及建议。
- 关于相机设置:
-
- 关于标定板的放置:
-
-
视野覆盖范围与方位
在标定图像集中,视野的每个区域都应至少被标定板覆盖一次。标定板也可填满整个图像。标定板的方位在图像集中应有所变化。
-
倾斜角度
标定图像集还应包含带有倾斜标定板的图像。标定板应以约 30-45°的角度朝不同方向倾斜。请注意,若因景深有限等原因无法达到推荐角度,则应尽可能在现有设备条件下使标定板倾斜至最大角度。
-
图像数量/标定板姿态
然而,您必须确保标定板的摆放姿势也满足其他要求。
-
标定板的倒置采集
标定标记不得倒置采集。例如,当玻璃材质的标定板从背面采集时,或线扫描相机相对于图像坐标系未向下移动(即
为负值)时,可能发生此类情况。
- 关于图像属性与内容:
-
-
图案覆盖率
标定图案在图像中至少需要包含多少部分,取决于所使用的标定板。
当然,标定图案在相机视野中可见范围越大,标定板占据视野的比例越高,检测效果越佳。
-
标记直径
标定板上的标记在每张图像中的直径应至少为 20 像素。此要求对标定成功至关重要。
-
对比度
校准板的明暗区域对比度应至少达到 100 个灰度值(针对字节图像而言)。
-
过度曝光
为避免图像曝光过度,请确保标定板亮部区域的灰度值不超过 240(针对字节图像),尤其在标定标记附近区域。
-
均均性
标定板应均匀照明,避免产生反射。经验法则表明,标定板亮部区域的灰度值范围不应超过 45(针对字节图像而言)。
- 关于图像格式与预处理:
-
- 应采用哪种畸变模型?
-
可采用两种畸变模型:除法模型与多项式模型。除法模型使用一个参数来建模径向畸变,而多项式模型则使用五个参数来建模径向畸变与偏心畸变(详见“相机参数”和“使用的三维相机模型”部分)。
除法模型的优势在于能够更快地应用畸变校正,尤其是逆向畸变校正——即当世界坐标系投影到图像平面时。此外,当仅使用少量标定图像或视场覆盖不足时,除法模型通常比多项式模型产生更稳定的结果。多项式模型的主要优势在于其能更精确地建模畸变:通过高阶项建模径向畸变,同时涵盖偏心畸变。需注意多项式模型无法通过解析方法求解,因此必须通过迭代计算逆畸变,这比使用(可以解析方法求解的)除法模型计算逆畸变更为耗时。
通常情况下,标定应采用除法模型。若标定精度不足,可改用多项式模型。但需注意,多项式模型的标定序列必须对后续测量区域提供更全面的覆盖。标定板覆盖范围之外的区域可能出现畸变建模偏差,此现象既适用于图像边界,也适用于标定板未覆盖的视野内部区域。
使用的三维相机模型
通常而言,相机标定是指精确确定那些将任意三维世界点
投影到图像中(子)像素(r,c)的参数模型。当需要从图像计算目标的原始三维姿态时(例如用于工业零件测量),这至关重要。合适的投影模型取决于您设置中使用的相机类型。
对于由所用相机、镜头和帧抓取器组合决定的投影过程建模,HALCON 提供了以下三种三维相机模型:
- 面扫描针孔相机:
-
将面扫描相机与镜头组合使用时,该镜头会在物镜侧产生透视投影,并可能出现径向和偏心畸变。该镜头可为倾斜镜头,即镜头的光轴相对于相机传感器存在倾斜(此类镜头有时称为申普夫(Scheimpflug)镜头)。由于超中心镜头同样执行透视投影,因此配备超中心镜头的相机即为针孔相机。常规(即非倾斜式)针孔镜头与像侧远心镜头的模型结构完全一致。相反,针孔镜头与像侧远心倾斜镜头的模型存在显著差异,具体如下所述。
- 面扫描远心相机:
-
将面扫描相机与物镜侧的远心镜头组合使用,该镜头可在物镜侧实现平行投影,但可能产生径向和偏心畸变。该镜头可为倾斜镜头。常规(即非倾斜)双侧远心镜头与物侧远心镜头的模型完全一致。相反,双侧远心镜头与物侧远心倾斜镜头的模型存在显著差异,具体如下所述。
- 线扫描针孔相机:
-
线扫描相机与透视投影镜头相结合,该镜头可能产生径向畸变。目前线扫描相机不支持倾斜镜头。
- 线扫描远心相机:
-
线扫描相机与实现远心投影且可能产生径向畸变的镜头组合。目前线扫描相机不支持倾斜镜头。
要将给定世界坐标系中的三维点
变换为像素坐标系中的二维点 ,需要进行一系列变换:
|
|
|
|
|
三维世界点 |
|
|
变换为相机坐标系 |
|
|
投影到图像平面(二维点,仍处于度量坐标系中) |
|
|
已应用镜头畸变 |
|
|
若使用倾斜镜头,该点将被投射到倾斜的像平面上。此时,畸变点
仅位于无倾斜系统的虚像平面上。 |
|
|
像素坐标
|
以下段落将详细说明面扫描相机和线扫描相机的具体步骤。若需更详尽的三维相机模型说明及示意图,请参阅 “解决方案指南III-C 3D视觉” 中“基础知识”一章的“相机模型与参数”部分。
- 变换步骤1:
-
点 从世界坐标系变换为相机坐标系(点作为齐次向量,参见
affine_trans_point_3daffine_trans_point_3dAffineTransPoint3dAffineTransPoint3dAffineTransPoint3daffine_trans_point_3d)的公式为:
其中 和 分别表示旋转矩阵和平移矩阵(详细信息请参阅
“解决方案指南III-C 三维视觉” 中“基础知识”一章的“三维变换与姿态”部分)。
- 变换步骤2:
-
若底层相机模型为面扫描针孔相机,则
在图像平面上的投影由下列方程描述:
其中 。对于采用超中心镜头的相机,则适用以下方程:
若使用面扫描远心相机,则对应方程为:
其中 。
- 变换步骤3:
-
对于所有类型的相机,镜头畸变均可通过除法模型或多项式模型进行建模。
除法模型 采用单一参数 KappaKappaKappaKappakappakappa
来建模径向畸变。
若采用除法模型,下列方程可将畸变后的像平面坐标变换为未畸变的像平面坐标:
这些方程可通过解析方法求解,从而得到以下方程,用于将未变形坐标变换为变形坐标:
该 多项式模型 使用三个参数()来描述径向畸变,并使用两个参数()来描述偏心畸变。
若采用多项式模型,下列方程可将畸变的像平面坐标变换为未畸变的像平面坐标:
其中
这些方程无法通过解析方法求解。因此,必须通过数值计算从未畸变的像平面坐标推导出畸变的像平面坐标。
- 倾斜镜头的额外变换步骤:
-
若相机镜头为倾斜镜头,则镜头相对于像平面的倾斜由旋转角 和倾斜角 描述。
在此步骤中,您需要进一步区分不同类型的倾斜镜头,具体如下所述。有关不同类型倾斜镜头的概述,请参阅 “解决方案指南III-C 三维视觉” 中“基础知识”一章的“相机型号与参数”部分。
对于 透视倾斜镜头 和 物测远心倾斜镜头(在镜头像侧执行透视投影),将点 投影至倾斜像平面上的点 的过程由透视二维变换描述,即通过齐次 3×3 矩阵 实现(参见
projective_trans_point_2dprojective_trans_point_2dProjectiveTransPoint2dProjectiveTransPoint2dProjectiveTransPoint2dprojective_trans_point_2d):
其中 是齐次点经透视变换后得到的附加坐标。
其中 且
其中 和 。
对于 图像侧远心倾斜镜头 和
双侧远心倾斜镜头(在镜头图像侧实现平行投影),其在倾斜图像平面上的投影可通过线性二维变换描述,即由 2×2 矩阵表示:
其中 与上述投影镜头中的定义相同。
- 变换步骤4: /
-
最后,点 (若存在倾斜镜头则为 )从像平面坐标系变换到图像坐标系(像素坐标系):
对于线扫描相机,相机与目标之间的相对运动也必须建模。在 HALCON 中,对此运动作出以下假设:
-
相机以恒定速度沿直线运动。
-
相机的朝向保持不变。
-
所有图像的运动都是相同的。
运动由运动向量 描述,该向量必须以[米/行]为单位在相机坐标系中给出。运动向量描述了相机的运动,假设目标是静止的。实际上,这等同于假设相机固定不动,而目标沿 方向移动。
线扫描相机的相机坐标系定义如下:坐标系原点分别定义为投影中心(针孔相机)或畸变中心(远心相机)。z 轴与光轴重合,其方向设定为可见点具有正 z 坐标。y 轴垂直于传感器线和 z 轴,其方向设定为运动向量具有正 y 分量。x 轴垂直于 y 轴和 z 轴,从而形成右手坐标系。
在图像采集过程中,随着相机在目标上方移动,相机坐标系也会相对于目标发生位移,即每条图像线都是从不同位置成像的。这意味着每条图像线都具有独立的姿态。为简化处理,HALCON 中所有世界坐标系与相机坐标系之间的变换均仅基于首条图像线的姿态。在将点 投影至图像时,会考虑运动 的影响。因此,find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object 算子仅计算首条图像线的姿态(并由 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras
存储于标定结果中)。
对于 线扫描相机,世界坐标系到相机坐标系()的变换原理相同。因此,您也可以应用上述针对面扫描相机描述的变换步骤 1。
对于 线扫描针孔相机,相机坐标系中给定点
在图像中的(子)像素坐标 投影可按以下方式建模:
假设
以下方程组必须求解 、 和 :
其中 和
是上述针对面扫描相机描述的无畸变函数,且 。
对于 线扫描远心相机,必须求解以下方程组以确定 和 :
其中 、 和 如上定义。需注意,对于远心相机而言, 和
均不影响投影结果。
上述公式已包含对图像畸变的补偿。
最后,该点被变换到像素坐标系中,即图像坐标系:
与特定相机类型相关的其他限制
对于 针孔相机,若标定板在所有图像中均相互平行(特别是当它们都位于同一平面时),则无法同时确定 FocusFocusFocusFocusfocusfocus 与全部六个外部相机参数。例如,在此情况下无法同时确定 FocusFocusFocusFocusfocusfocus 与标定板到相机的距离。为确保能唯一确定所有相机参数,请务必采集不同倾斜角度的标定板图像。
对于 远心镜头,无法确定标定板与相机的距离。因此,在标定结果中,标定板姿态的 z 分量被设定为 1 米。此外,如前所述,对于远心线扫描相机, 无法确定且保留其初始值,但具有共同运动向量的多相机设置除外——在此情况下可确定 值。
对于 倾斜镜头,镜头畸变越大,倾斜角度的测定精度就越高。对于畸变较小的镜头,倾斜角度无法可靠测定。因此,优化后的倾斜参数可能与系统标称倾斜参数存在显著差异。若出现此情况,请检查
ErrorErrorErrorErrorerrorerror 参数。若 ErrorErrorErrorErrorerrorerror 值较小,则所得相机参数能在校准体积内一致描述成像几何结构,可用于精确测量。
对于 透视倾斜镜头 和 物侧远心倾斜镜头,只有当倾斜角度不为 0 度时,成像平面距离才能唯一确定。倾斜角度越小,成像平面距离的确定精度越低。因此,优化后的像平面距离可能与系统标称像平面距离存在显著差异。若出现此情况,请检查 ErrorErrorErrorErrorerrorerror 参数。若 ErrorErrorErrorErrorerrorerror
值较小,则所得相机参数能在校准体积内一致描述成像几何特性,可用于精确测量。
对于围绕水平或垂直轴倾斜的 透视倾斜镜头 和 物侧远心倾斜镜头,即旋转角度为0、90、180或270度,其倾斜角度 、缩放系数 、焦距 (适用于透视倾斜镜头)或放大倍率 (适用于物侧远心倾斜镜头),以及倾斜图像平面与透视投影中心的距离 无法唯一确定。在此情况下,将 排除在优化之外,通过调用
set_calib_data(CalibDataID, 'camera', 'general', 'excluded_settings', 'sx')set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "sx")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "sx")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "sx")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "sx")set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "sx")。
此外,请注意对于倾斜镜头,仅能同时确定倾斜角 和反射角 。这是实现层面的选择,可使优化过程在数值上更具稳健性。因此,通过调用以下算子,参数 和
将同时被排除在优化范围之外:
set_calib_data(CalibDataID, 'camera', 'general', 'excluded_settings', 'tilt')set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "tilt")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "tilt")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "tilt")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "tilt")set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "tilt")。
配备大焦距倾斜镜头的针孔相机具有近乎远心投影特性。因此,如前所述, 与倾斜参数 和 存在相关性,只能进行不精确的同步测定。在此情况下,同样建议将 排除在优化范围之外。
对于远心镜头,单张图像中标定板始终存在两种可能的姿态。因此无法确定图像中实际呈现的是两种姿态中的哪一种。这种模糊性也会影响远心倾斜镜头的倾斜参数 和
。因此,根据 和
的初始参数设定,相机标定可能返回替代参数而非标准参数。若出现此情况,请检查
ErrorErrorErrorErrorerrorerror 值。若 ErrorErrorErrorErrorerrorerror 值较小,则所得相机参数能在校准体积内一致描述成像几何结构,可用于精确测量。
对于 采用多项式畸变模型的线扫描相机(适用于配备透视镜头及远心镜头的相机),参数 和 与相机模型中的其他参数存在高度相关性。因此,通常无法可靠地确定这些参数,应通过调用
set_calib_data(CalibDataID, 'camera', 'general', 'excluded_settings', 'poly_tan_2')set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "poly_tan_2")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "poly_tan_2")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "poly_tan_2")SetCalibData(CalibDataID, "camera", "general", "excluded_settings", "poly_tan_2")set_calib_data(CalibDataID, "camera", "general", "excluded_settings", "poly_tan_2")。
节列表