Halcon3D——模型调平

什么是调平

调平的直观解释就是让模型对齐到我们的Halcon控件坐标系下。由于三维数据获取时的角度问题,模型往往不是跟坐标轴对齐的,这个时候就需要调平。让模型的一个明显的平面与坐标轴面平行。
image
从上图可以看到,我们点云模型并不是跟坐标系对齐的。这在很大程度上增加了我们分析的复杂度(因为我们根本不知道获取的模型相对于平台的位置)。那么如何进行模型调平呢?
调平方法目前主要有三种,本文主要先介绍后两种,第一种暂时没遇到过

  1. 拟合平面的方式
  2. 不规则物体的调平
  3. 规则物体的调平

不规则物体的调平

该类物体的调平,我们主要借助算子moments_object_model_3d实现。该算子可以通过主成分分析法,帮我们计算出当前模型的3个轴,分为称为第一主轴、第二主轴、第三主轴。实际上就是找到当前模型三个方差最大的方向。第一大的是第一主轴然后以此类推。
通过这个算子可以得到新计算出的坐标系的Pose,然后把物体做3D仿射变换移动到原坐标系即可。

  1. 坐标系的原点是点的坐标值的均值。
  2. x轴对应第一主轴,y对应第二主轴,z对应第三主轴。
    image
点击查看代码
dev_close_window ()
FontSize := 14
WindowSize := 500
dev_open_window (0, 0, WindowSize, WindowSize, 'white', WindowHandle1)
set_display_font (WindowHandle1, FontSize, 'mono', 'true', 'false')
GenParamName := ['lut','color_attrib','light_position','disp_pose','alpha']
GenParamValue := ['color1','coord_z','0.0 0.0 -0.3 1.0','true',0.9]
read_object_model_3d ('cutting_edge.om3', 'm', [], [], ObjectModel3D, Status)
create_pose (-0.0005, -0.0005, 0.04, 280, 0, 20, 'Rp+T', 'gba', 'point', DispPose1)
create_pose (0, -0.0005, 0.04, 280, 0, 20, 'Rp+T', 'gba', 'point', DispPose2)
disp_object_model_3d (WindowHandle1, ObjectModel3D, [], DispPose1, GenParamName, GenParamValue)
moments_object_model_3d (ObjectModel3D, 'principal_axes', Moments)
*反转位姿
pose_invert (Moments, MomentsInvert)
pose_to_hom_mat3d (MomentsInvert, HomMat3D)
affine_trans_object_model_3d (ObjectModel3D, HomMat3D, ObjectModel3DAffineTrans)
disp_object_model_3d (WindowHandle1, ObjectModel3DAffineTrans, [], DispPose2, GenParamName, GenParamValue)

规则物体的调平

我们首先通过Halcon中通过算子smallest_bounding_box_object_model_3d生成一个能够包括当前模型的最小外接box。在Halcon中,该box通过其位姿以及三个边的长度来描述,其中最长边对应当前box的X轴,次长边对应Y轴,最短边对应Z轴。
image
然后重复上面的操作,生成一个相反的变换。即可实现调平。
image

点击查看代码
smallest_bounding_box_object_model_3d (OriginObjectModel3D, 'oriented', boxPose, Length1, Length2, Length3)
gen_box_object_model_3d (boxPose, Length1, Length2, Length3, box)
disp_object_model_3d (WindowHandle1, [OriginObjectModel3D,box], [], DispPose1, GenParamName, GenParamValue)
pose_invert (boxPose, boxPoseInvert)
pose_to_hom_mat3d (boxPoseInvert, box_pose_HomMat3D)
hom_mat3d_translate (box_pose_HomMat3D, Length1/2, Length2/2, Length3/2, HomMat3DTranslate)
affine_trans_object_model_3d (OriginObjectModel3D, HomMat3DTranslate, ObjectModel3DAffineTrans1)
smallest_bounding_box_object_model_3d (ObjectModel3DAffineTrans1, 'oriented', boxPose, Length1, Length2, Length3)
gen_box_object_model_3d (boxPose, Length1, Length2, Length3, box)
disp_object_model_3d (WindowHandle1,[ObjectModel3DAffineTrans1,box], [], DispPose2, GenParamName, GenParamValue)

由于咱们计算了三维物体的外接框,那么咱们也能够通过平移变换,让我们边界框的任意一个角跟坐标轴对齐。如下,我们通过平移让外接框的左上角对齐坐标轴。
image

posted @ 2025-10-14 20:41  Ytytyty  阅读(56)  评论(0)    收藏  举报