多视角

算子列表 ↓

本章介绍了如何校准不同的多视角相机设置。

为实现高精度测量任务,您需要对相机系统进行校准。相较于单相机系统,多视角相机系统的标定需满足若干额外要求。下文将阐述多视角相机系统的标定要点。有关相机标定的通用信息,请参阅 标定 一章。

为多视角相机系统准备标定输入数据

在执行实际标定之前,必须准备标定数据模型(如 标定 所述)。对于多相机设置,还应考虑以下额外因素:

执行实际相机标定

calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 执行的标定取决于标定设置中涉及的相机类型。虽然不同相机设置在采集图像时需要特定条件,但包含投影式和/或远心相机的设置在标定流程的基本步骤上具有相似性:

  1. 构建观测姿态链: 在第一步中,算子 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 试图构建一条有效的观测姿态链,该链将所有相机和标定对象的姿态连接到基准相机。根据具体设置的不同,有效姿态链的条件也各不相同。具体信息请参见下文相关段落。

    若存在无法触及的相机(即其未观测到可纳入姿态链的标定对象姿态),则标定过程将以错误告终。否则,算法将通过该链依次初始化所有标定项的姿态。

  2. 首次优化: 在此步骤中,calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 算子对所有未被明确排除在标定之外的优化参数执行实际优化。

  3. 第二次优化: 基于目前已校准的相机,该算法会修正所有包含标记轮廓信息的观测数据(参见 find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObjectfind_calib_object)。随后,标定设置将重新优化以使修正生效。若无轮廓信息可用,则跳过此步骤。

  4. 计算参数估计的质量: 在最后一步中,calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras 计算校准后内部相机参数的标准差和协方差。

以下段落将进一步说明相机设置的具体条件。

投影面扫描相机

对于采用投影式面扫描相机的系统,标定过程遵循上述四个步骤。该算法旨在构建一条观测姿态链,将所有相机与标定对象的姿态连接至基准相机,如下图所示。

image/svg+xml image/svg+xml
( 1) ( 2)
(1) 所有相机均可通过观测姿态链连接。(2) 最左侧相机处于孤立状态,因为其他相机均无法观测到左侧标定板.

可能的投影式面扫描相机包括:

  • 'area_scan_division'"area_scan_division""area_scan_division""area_scan_division""area_scan_division""area_scan_division"

  • 'area_scan_polynomial'"area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial"

  • '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_polynomial'"area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial"

  • '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_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_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_polynomial'"area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial"

远心面扫描相机

对于采用远心面扫描相机的系统,其操作流程与透视面扫描相机类似,同样执行上述四个步骤。在第一步(构建连接所有相机与标定目标的观测姿态链)中,需满足额外条件:由于对象姿态仅能确定至沿光轴的平移量,每个标定目标必须由至少两台相机观测才能确定其相对位置. 否则该对象姿态将被排除在标定之外。此外,由于平面标定对象在两个不同观察角度下呈现相同形态,相机间的相对姿态无法唯一确定。因此始终存在两种有效的相对姿态方案。两种方案均能构成一致的相机设置用于测量。由于无法消除这种模糊性,系统将返回首选方案。需注意:若返回的姿态并非真实姿态而是备选方案,则会导致镜像重建结果。

可能的远心面扫描相机包括:

  • '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_polynomial'"area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial"

  • '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_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_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_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"

投影和远心面扫描相机

对于采用透视和远心面扫描相机的混合设置,该算法执行与上述相同的四个步骤。正如前文针对远心相机系统所述,第一步(构建连接所有相机与标定目标的观测姿态链)可能出现的歧义,只要存在由所有透视镜头及足够数量标定目标组成的观测姿态链即可消除。此处“足够数量”指每台远心相机至少观测到该链中的两个标定目标。

image/svg+xml (P) (T) (P) image/svg+xml (P) (T) (P)
( 1) ( 2)
混合标定设置包含透视(P)和远心(T)面扫描相机。(1)所有透视相机通过仅包含透视相机的观测姿态链相连。(2)最右侧的透视相机无法观测到第二块标定板(从左数第二块)。因此无法唯一确定两台透视相机之间的相对姿态。
线扫描相机

配备远心线扫描相机('line_scan_telecentric'"line_scan_telecentric""line_scan_telecentric""line_scan_telecentric""line_scan_telecentric""line_scan_telecentric")的系统与配备远心面扫描相机的系统行为完全一致,且适用上述所述的相同限制与模糊性。此类系统可区分两种可能的配置方案。第一种配置中,所有相机均固定安装且静止不动,对象在线性轨道上移动至相机前方。另一种方案是所有相机相互固定安装,由同一线性执行器驱动横向移动至物体上方。两种情况下所有相机共享共同运动向量,该向量在基准相机的相机坐标系中建模,并通过各相机姿态的旋转部分转换至其他相机的坐标系。此配置为默认选项。第二种配置中,相机通过独立线性执行器沿不同方向移动,此时每台相机拥有独立运动向量。配置类型可通过 set_calib_dataset_calib_dataSetCalibDataSetCalibDataSetCalibDataset_calib_data 算子选择。

image/svg+xml image/svg+xml image/svg+xml
( 1) ( 2) ( 3)
不同配置的远心线扫描相机系统可分为以下三类:(1) 若相机固定安装而对象作线性移动时,仅需计算一个运动向量;(2) 或当相机相互刚性连接时,相机在对象上方移动即可确定运动向量;(3) 若相机相互独立移动,则需为每台相机分别确定运动向量。

请注意,远心线扫描相机通常采用两种不同的立体设置方案。这两种方案均假设被观测对象或相机系统分别保持线性恒定运动。

  • 对于沿轨设置,一台相机放置在前方,朝向后方拍摄;另一台相机安装在后方,朝向前方拍摄,两者均以相对于运动向量的适当角度进行安装。

  • 跨轨设置的相机均垂直于运动方向排列,而其视平面大致共面。因此景深相当有限,仅在各相机景深重叠的区域内才能实现精确测量。

image/svg+xml image/svg+xml
( 1) ( 2)
远心线扫描相机的立体设置方案:(1) 沿轨设置(2) 跨轨设置。

对于采用投影线扫描相机('line_scan'"line_scan""line_scan""line_scan""line_scan""line_scan")的设置,存在以下限制:每个设置中仅能校准一台相机,且仅能使用一个标定对象。

最后,对于标记呈矩形排列的标定板(参见 gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab),所有观测数据必须包含标定对象上所有标定标记的投影坐标。而对于标记呈六边形排列的标定板(参见 create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltabcreate_caltab),则不受此限制。有关标定板及标定图像采集的更多信息,请参阅 标定 一章中的“标定过程补充说明”部分。

检查标定是否成功

若同时校准多台相机,ErrorErrorErrorErrorerrorerror 值的判断难度将增加。经验法则表明,ErrorErrorErrorErrorerrorerror 值应尽可能小且至少小于 1.0,这表明校准参数可实现亚像素级精度的数据评估。在特定配置下,该值可能难以达到。若需进一步分析标定质量,请参考估计参数的标准差与协方差。

获取标定结果

标定结果,即相机内部参数、相机姿态(外部参数)、标定对象姿态等,可通过 get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibDataget_calib_data 算子进行查询。

请注意,远心相机的姿态仅能确定至其坐标系中 z 轴方向(垂直于成像平面)的位移量。因此需将所有相机姿态沿该轴线平移,直至它们共同位于一个球面上。该球心的位置由首个标定对象的姿态决定,球半径则取决于标定设置。若同时校准透视与远心面扫描相机,球半径取透视相机至首个标定对象所有距离中的最大值;若仅校准远心面扫描相机,则球半径固定为 1 米。


算子列表

calibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerascalibrate_cameras标定相机
通过同时最小化过程确定所有相机参数。
clear_calib_dataClearCalibDataclear_calib_dataClearCalibDataclear_calib_data清除标定数据
释放标定数据模型的内存。
clear_camera_setup_modelClearCameraSetupModelclear_camera_setup_modelClearCameraSetupModelclear_camera_setup_model清除相机设置模型
释放标定设置模型的内存。
create_calib_dataCreateCalibDatacreate_calib_dataCreateCalibDatacreate_calib_data创建标定数据
创建 HALCON 标定数据模型。
create_camera_setup_modelCreateCameraSetupModelcreate_camera_setup_modelCreateCameraSetupModelcreate_camera_setup_model创建相机设置模型
为标定的相机设置创建模型。
deserialize_calib_dataDeserializeCalibDatadeserialize_calib_dataDeserializeCalibDatadeserialize_calib_data反序列化标定数据
反序列化一个序列化的标定数据模型。
deserialize_camera_setup_modelDeserializeCameraSetupModeldeserialize_camera_setup_modelDeserializeCameraSetupModeldeserialize_camera_setup_model反序列化相机设置模型
反序列化一个序列化的相机设置模型。
get_calib_dataGetCalibDataget_calib_dataGetCalibDataget_calib_data获取标定数据
查询在标定数据模型中存储或计算的数据。
get_calib_data_observ_contoursGetCalibDataObservContoursget_calib_data_observ_contoursGetCalibDataObservContoursget_calib_data_observ_contours获取标定数据观测轮廓
从标定数据模型中获取基于轮廓的观测数据。
get_calib_data_observ_pointsGetCalibDataObservPointsget_calib_data_observ_pointsGetCalibDataObservPointsget_calib_data_observ_points获取标定数据观测点
从标定数据模型中获取基于点的观测数据。
get_camera_setup_paramGetCameraSetupParamget_camera_setup_paramGetCameraSetupParamget_camera_setup_param获取相机设置参数
获取通用相机设置模型参数。
query_calib_data_observ_indicesQueryCalibDataObservIndicesquery_calib_data_observ_indicesQueryCalibDataObservIndicesquery_calib_data_observ_indices查询标定数据观测索引
查询有关相机、标定对象和标定对象姿态之间关系的信息。
read_calib_dataReadCalibDataread_calib_dataReadCalibDataread_calib_data读取标定数据
从文件中恢复标定数据模型。
read_camera_setup_modelReadCameraSetupModelread_camera_setup_modelReadCameraSetupModelread_camera_setup_model读取相机设置模型
从文件还原相机设置模型。
remove_calib_dataRemoveCalibDataremove_calib_dataRemoveCalibDataremove_calib_data移除标定数据
从标定数据模型中移除数据集。
remove_calib_data_observRemoveCalibDataObservremove_calib_data_observRemoveCalibDataObservremove_calib_data_observ移除标定数据观测
从标定数据模型中移除观测数据。
serialize_calib_dataSerializeCalibDataserialize_calib_dataSerializeCalibDataserialize_calib_data序列化标定数据
序列化标定数据模型。
serialize_camera_setup_modelSerializeCameraSetupModelserialize_camera_setup_modelSerializeCameraSetupModelserialize_camera_setup_model序列化相机设置模型
序列化相机设置模型。
set_calib_dataSetCalibDataset_calib_dataSetCalibDataset_calib_data设置标定数据
在标定数据模型中设置数据。
set_calib_data_calib_objectSetCalibDataCalibObjectset_calib_data_calib_objectSetCalibDataCalibObjectset_calib_data_calib_object设置标定数据标定对象
在标定模型中定义标定对象。
set_calib_data_cam_paramSetCalibDataCamParamset_calib_data_cam_paramSetCalibDataCamParamset_calib_data_cam_param设置标定数据相机参数
在标定数据模型中设置相机的类型和初始参数。
set_calib_data_observ_pointsSetCalibDataObservPointsset_calib_data_observ_pointsSetCalibDataObservPointsset_calib_data_observ_points设置标定数据观测点
在标定数据模型中设置基于点的观测数据。
set_camera_setup_cam_paramSetCameraSetupCamParamset_camera_setup_cam_paramSetCameraSetupCamParamset_camera_setup_cam_param设置相机设置相机参数
在相机设置模型中定义相机的类型、参数和相对姿态。
set_camera_setup_paramSetCameraSetupParamset_camera_setup_paramSetCameraSetupParamset_camera_setup_param设置相机设置参数
设置通用相机设置模型参数。
write_calib_dataWriteCalibDatawrite_calib_dataWriteCalibDatawrite_calib_data写入标定数据
将标定数据模型存储到文件中。
write_camera_setup_modelWriteCameraSetupModelwrite_camera_setup_modelWriteCameraSetupModelwrite_camera_setup_model写入相机设置模型
将相机设置模型存储到文件中。