为什么要对标定好的坐标系原点进行变换?
在Halcon相机标定的过程中,总是要用到set_origin_pose对世界坐标系进行变换,如果不使用set_origin_pose函数来显式设置坐标系的原点和姿态,默认情况下使用的是第一张图的位姿。这对于不需要进行复杂的坐标系变换的场景来说可能已经足够,但是,在一些需要更精确的图像处理和分析任务中,需要显式地设置坐标系的原点和姿态,以便更精确地描述对象的位置和姿态,进行更复杂的图像配准、校正等操作。这时就需要使用set_origin_pose函数来进行设置。
函数定义
set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin)
set_origin_pose通过DX, DY和DZ给出的矢量转换3D姿态PoseIn的原点,并在PoseNewOrigin中返回结果。注意,平移是相对于姿态本身的局部坐标系执行的。说白了就是把PoseIn xyz 三个方向移动。
数学公式
等价代码
pose_to_hom_mat3d (PoseIn, HomMat3DIn)
hom_mat3d_translate_local (HomMat3DIn, DX, DY, DZ, HomMat3DNewOrigin)
hom_mat3d_to_pose (HomMat3DNewOrigin, PoseNewOrigin)
使用示例
例子中使用的是第一张图片的位姿,让后平移了标定板的厚度
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
* The reference image, i.e., the image in which the calibration
* plate is located on the ruler is the first image
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
* To take the thickness of the calibration plate into account, the z-value
* of the origin given by the camera pose has to be translated by the
* thickness of the calibration plate.
* Deactivate the following line if you do not want to add the correction.
set_origin_pose (Pose, 0, 0, 0.002, Pose)
矫正图像示例
TmpCtrl_RectificationWidth := 73
TmpCtrl_RectificationWidth := TmpCtrl_RectificationWidth / 1000.0
* 调整原点使得标定板大致居中 倾斜的情况矫正可能会有偏移 随便调 观察情况
set_origin_pose (CameraPose, -0.5*TmpCtrl_RectificationWidth, -0.4*TmpCtrl_RectificationWidth, 0, TmpCtrl_RectificationPose)
* 创建投射图
gen_image_to_world_plane_map (TmpObj_RectificationMap, CameraParameters, TmpCtrl_RectificationPose, 640, 480, 640, 480, TmpCtrl_RectificationWidth / 640, 'bilinear')
* 释放内存
clear_calib_data (CalibHandle)
* 使用投射图校准
map_image (Image, TmpObj_RectificationMap, TmpObj_RectifiedImage)
* 显示结果
dev_display (TmpObj_RectifiedImage)