Halcon算子学习:create_surface_model

在这里插入图片描述

create_surface_model

( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)
创建执行基于表面的匹配所需的数据结构

输入:

  • object_model_3d
    3D对象模型的句柄。
  • RelSamplingDistance (input_control) real→(real)
    相对于物体直径的采样距离
    默认值:0.03
    建议值:0.1,0.05,0.03,0.02,0.01
    限制:0 < RelSamplingDistance < 1
  • GenParamName (input_control)
    通用参数的名称。
    默认值:[]
    建议值:model_invert_normalspose_ref_rel_sampling_distancefeat_step_size_relfeat_angle_resolutiontrain_3d_edges
  • GenParamValue
    通用参数的值。
    默认值:[]
    建议值:0,1,‘true’, ‘false’,0.005,0.01,0.02,0.05,0.1

输出:

  • SurfaceModelID (output_control)
    表面模型的句柄

算子说明

1、操作符create_surface_model为3D对象模型ObjectModel3D创建基于表面的匹配模型。例如,以前可以使用read_object_model_3d从文件读取3D对象模型,或者使用xyz_to_object_model_3d创建3D对象模型。创建的表面模型在SurfaceModelID中返回。

2、曲面模型的创建要求三维对象模型包含点和法线。下列组合是可能的:

  • 点和点法线;
  • 点和三角形或多边形网格,例如,从CAD文件;
  • 点和2d映射,例如用xyz_to_object_model_3d三倍转换的XYZ图像。

3、注意,模型法线的方向和方向(向内或向外)对于匹配非常重要。还请注意,对于边缘支持的基于表面的匹配,模型必须包含一个三角形或多边形网格(如图)
在这里插入图片描述
4、表面模型是通过对一定距离的三维对象模型采样来创建的。采样距离必须在参数RelSamplingDistance中指定,并相对于三维对象模型的轴向-平行 边界框(axis-parallel bounding box)的直径进行参数化。例如,如果RelSamplingDistance设置为0.05,ObjectModel3D的直径为“10 cm”,则从对象表面采样的点之间的距离大约为“5 mm”。采样点用于操作符find_surface_model中的近似匹配(参见下面)。可以使用操作符get_surface_model_param使用值’sampled_model’获得采样点。请注意,应该避免对象模型中的离群点,因为它们会破坏直径。
减少RelSamplingDistance会产生更多的点,从而实现更稳定但更慢的匹配。增加RelSamplingDistance会导致更少的点,从而导致更少的稳定但更快的匹配。

5、采样点用于通过操作符find_surface_model在场景中查找对象模型。为此,要检查点集中所有可能的点对,并计算每对点的距离和相对表面方向。这两个值被离散化并存储以进行匹配。通用参数**‘feat_step_size_rel’和‘feat_angle_resolution’可分别用于设置距离和方向角的离散化**(如下所示)。

再次采样3D对象模型进行姿态细化。第二次采样的采样距离较小,导致更多的点。通用参数**'pose_ref_rel_sampling_distance’设置相对于对象直径的采样距离**。降低该值可以得到更精确的位姿细化,但会导致更大的模型和更慢的模型生成和匹配。增加该值会导致更少的精确姿态细化,但会导致更小的模型和更快的模型生成和匹配(见下文)。

6、此外,基于表面的匹配可以使用3D边缘来改进对齐(排列)。这对于平面或包含较大平面边的对象特别有帮助,例如在不正确的旋转或背景平面中发现它们。为了允许find_surface_model也对齐边缘,必须通过将通用参数‘train_3d_edges’设置为‘true’来训练表面模型。在这种情况下,模型必须包含一个网格,即三角形或多边形。此外,对于边缘支持的基于表面的匹配的训练需要 OpenGL 2.1、GLSL 1.2和OpenGL扩展GL_EXT_framebuffer_object和GL_EXT_framebuffer_blit。我也可以比没有边缘支持的训练花更长的时间。
通用参数对GenParamName和GenParamValue用于为模型生成设置额外的参数。GenParamName包含要设置的参数名的元组,GenParamValue包含相应的值。以下值是可能的GenParamName:

  • “model_invert_normals”:
    反转模型表面法线的方向。模型生成需要知道正常的方向。如果模型和场景都使用相同的设置,法线将指向相同的方向。如果模型是从CAD文件加载的,法线可能指向相反的方向。如果你在场景表面的“外部”发现了模型,并且模型是由CAD文件创建的,试着将这个参数设置为“true”。另外,确保CAD文件中的法线都指向外或内,即,始终一个方向。法向与曲面模型的姿态细化无关。因此,如果对象模型仅与操作符refine_surface_model_pose一起使用,则‘model_invert_normals’的值对结果没有影响。
    可能的值:‘false’, ‘true’
    默认值:“假”

  • “pose_ref_rel_sampling_distance”:
    设置相对于对象直径的姿态细化的采样距离。减少这个值会导致更精确的姿态细化,但会导致更大的模型和更慢的模型生成和细化。增加该值会导致更少的精确姿态细化,但会导致更小的模型和更快的模型生成和匹配。
    建议值:0.05、0.02、0.01、0.005
    默认值:0.01
    断言:0 < ‘pose_ref_rel_sampling_distance’ < 1

  • “feat_step_size_rel”:
    设置点对距离相对于物体直径的离散化距离。该值默认为RelSamplingDistance的值。不建议更改此值。对于噪声很大的场景,可以通过增加值来提高对噪声点的匹配的鲁棒性。
    建议值:0.1、0.05、0.03
    默认值:RelSamplingDistance的值
    断言:0 < ‘feat_step_size_rel’ < 1

  • “feat_angle_resolution”:
    将点对方向的离散化设置为角度细分的数目。建议不要更改此值。值的增加增加了匹配的精度,但降低了对不正确法线方向的鲁棒性。值的减少降低了匹配的精度,但增加了对不正确法线方向的鲁棒性。对于法线方向无法精确计算的非常嘈杂的场景,该值可以设置为25或20。
    建议值:20、25、30
    默认值:30
    断言:‘feat_angle_resolution’ > 1

  • “train_3d_edges”:
    支持边缘支持的基于表面的匹配和细化的训练。在这种情况下,模型必须包含一个网格,即三角形或多边形。这个参数需要OpenGL。 可能的值:‘false’, ‘true’ 默认值:“假”