Halcon算子学习:distance_object_model_3d

时间:2024-02-25 07:37:34

在这里插入图片描述

distance_object_model_3d

( : : ObjectModel3DFrom, ObjectModel3DTo, Pose, MaxDistance, GenParamName, GenParamValue : )
计算一个3D对象模型到另一个3D对象模型的点的距离。

输入:

  • object_model_3d→(整数)
    源3D对象模型的句柄。
  • ObjectModel3DTo
    目标3D对象模型的句柄。
  • Pose
    源3D对象模型在目标3D对象模型中的姿态。
    默认值:[]
  • MaxDistance
    最大兴趣距离。
    默认值:0
  • GenParamName
    通用输入参数的名称。
    默认值:[]
    值列表:‘distance_to’, ‘invert_pose’, ‘method’, ‘output_attribute’, ‘sampling_dist_abs’, ‘sampling_dist_rel’, \'signed_distance \', ‘store_closest_index’
  • GenParamValue
  • 通用输入参数的值。
    默认值:[]
    值列表:‘auto’, ‘false’, ‘kd-tree’, ‘linear’, ‘points’, ‘polygons’, ‘primitive’, \'triangle \', ‘true’, ‘voxel’

算子描述

操作符distance_object_model_3d计算三维对象模型ObjectModel3DFrom中的点到三维对象模型ObjectModel3DTo中的点、三角形、多边形或原语的距离。在3D对象模型ObjectModel3DFrom中,距离被存储为一个名为==“&distance”==的扩展属性。随后可以使用get_object_model_3d_params查询该属性,或者使用select_points_object_model_3d或其他使用扩展属性的操作符处理该属性。

目标数据(点、三角形、多边形或原语)是根据ObjectModel3DTo中包含的属性选择的。它是根据以下优先级中数据的存在而选择的:原语、三角形、多边形和点。作为这种自动目标数据选择的替代方法,还可以使用通用参数’distance_to’设置目标数据类型(参见下面)。在计算到最终三角形的距离之前,操作符在内部对一般的非三角形多边形进行三角化。因此,用三角形对象调用操作符比用具有不同多边形面的对象调用它要快。

可以选择使用参数MaxDistance设置阈值。超过此阈值的距离设置为MaxDistance的值,即,值被剪切。设置MaxDistance可以显著加快该操作符的执行速度。如果MaxDistance设置为0,则不使用阈值。

如果Pose是非空元组,那么在计算距离之前,它必须包含一个应用于ObjectModel3DFrom中的点的Pose。可以使用通用参数‘invert_pose’(见下面)来反转这个位姿。

根据目标数据类型(点、三角形或原语),有几种计算距离的方法。其中一些方法在ObjectModel3DTo的元素上计算数据结构,以加速距离计算。可以使用操作符prepare_object_model_3d预先计算这些数据结构。这允许对distance_object_model_3d的多个调用来重用数据结构,从而节省了为每个调用重新计算数据结构的时间。对于具有非三角形多边形面的对象,操作符prepare_object_model_3d可以额外执行三角剖分并将其保存到对象中,以进一步加速distance_object_model_3d操作符。只有在将通用参数’distance_to’设置为’triangle \'时才会执行这种三角测量。注意,与操作符triangulate_object_model_3d相反,这种三角划分并不清除polygons属性。

当计算到点或三角形的距离时,操作符可以选择返回ObjectModel3DFrom中每个点的最近点或三角形的索引,方法是将通用参数‘store_closest_index’设置为‘true’(参见下面)。索引在3D对象模型ObjectModel3DFrom中存储为扩展属性’&closest_index’。注意,在使用“体素”方法时,不能计算最近的索引。如果点到最近元素的距离超过MaxDistance中设置的最大距离,则最近的索引设置为-1。

可以选择计算到点、三角形或原语的带符号距离。因此,必须将通用参数’signed_distance ‘设置为’true’。注意,当使用“体素”方法结合点到点距离时,不能计算符号距离。

下面将介绍不同的目标类型和方法,并描述它们的优缺点。注意,操作符根据目标数据类型自动选择默认方法。可以使用通用参数’method’覆盖此方法。

Distance to points:
计算点到点的距离有以下几种方法:

Linear search 线性搜索:

  • 对于ObjectModel3DFrom中的每个点,计算到ObjectModel3DTo中的所有点的距离,并使用最小的距离。这种方法不需要预先计算数据结构,并且对于ObjectModel3DTo中的少量点来说是最快的。

KD-Tree:

  • ObjectModel3DTo中的点被组织在一个kd树中,这加快了对最近点的搜索。树的构造非常高效。搜索时间与ObjectModel3DTo中的点数近似为对数。但是,搜索时间不是恒定的,并且根据查询点在ObjectModel3DFrom中的位置可能会发生显著变化。

Voxel 体素:

  • ObjectModel3DTo中的点组织在一个体素结构中。这种体素结构允许在几乎恒定的时间内进行搜索。,独立于查询点在ObjectModel3DFrom中的位置和在ObjectModel3DTo中的点的数量。但是,准备这个数据结构需要几秒钟或几分钟。它特别适合使用prepare_object_model_3d进行预计算。