create_surface_modelT_create_surface_modelCreateSurfaceModelCreateSurfaceModelcreate_surface_model创建表面模型(算子)
名称
create_surface_modelT_create_surface_modelCreateSurfaceModelCreateSurfaceModelcreate_surface_model — 创建执行基于表面的匹配所需的数据结构。
签名
void CreateSurfaceModel(const HTuple& ObjectModel3D, const HTuple& RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue, HTuple* SurfaceModelID)
HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue) const
HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue) const
HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const char* GenParamName, const char* GenParamValue) const
HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const wchar_t* GenParamName, const wchar_t* GenParamValue) const
(
Windows only)
void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue)
void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue)
void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const char* GenParamName, const char* GenParamValue)
void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const wchar_t* GenParamName, const wchar_t* GenParamValue)
(
Windows only)
void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue)
void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue)
void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const char* GenParamName, const char* GenParamValue)
void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const wchar_t* GenParamName, const wchar_t* GenParamValue)
(
Windows only)
static void HOperatorSet.CreateSurfaceModel(HTuple objectModel3D, HTuple relSamplingDistance, HTuple genParamName, HTuple genParamValue, out HTuple surfaceModelID)
HSurfaceModel HObjectModel3D.CreateSurfaceModel(double relSamplingDistance, HTuple genParamName, HTuple genParamValue)
HSurfaceModel HObjectModel3D.CreateSurfaceModel(double relSamplingDistance, string genParamName, string genParamValue)
public HSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, HTuple genParamName, HTuple genParamValue)
public HSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, string genParamName, string genParamValue)
void HSurfaceModel.CreateSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, HTuple genParamName, HTuple genParamValue)
void HSurfaceModel.CreateSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, string genParamName, string genParamValue)
描述
算子 create_surface_modelcreate_surface_modelCreateSurfaceModelCreateSurfaceModelCreateSurfaceModelcreate_surface_model 为三维对象模型 ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3Dobject_model_3d 创建一个用于基于表面匹配的模型。例如,该三维对象模型可以是之前使用 read_object_model_3dread_object_model_3dReadObjectModel3dReadObjectModel3dReadObjectModel3dread_object_model_3d 从文件中读取的,也可以是使用
xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d 创建的。创建的表面模型将通过 SurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDsurfaceModelIDsurface_model_id 返回。
在模型创建完成后,可以使用
set_surface_model_paramset_surface_model_paramSetSurfaceModelParamSetSurfaceModelParamSetSurfaceModelParamset_surface_model_param 设置表面模型的附加参数。
创建表面模型要求三维对象模型包含点和法线。以下组合是可行的:
请注意,模型法线的方向和朝向(向内或向外)对匹配过程至关重要。对于基于边缘支撑表面的匹配,法线必须指向内部,且模型必须包含三角形或多边形网格(见下文)。
表面模型是通过以特定距离对三维对象模型进行采样生成的。采样距离必须在
RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 参数中指定,且该距离是相对于三维对象模型轴平行边界框的直径进行参数化的。例如,若 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 设置为 0.05,且 ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3Dobject_model_3d 的直径为 10 cm,则从对象表面采样的点间距约为 5 mm。这些采样点将用于 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 算子中的近似匹配(见下文)。可通过
get_surface_model_paramget_surface_model_paramGetSurfaceModelParamGetSurfaceModelParamGetSurfaceModelParamget_surface_model_param 算子并使用 'sampled_model'"sampled_model""sampled_model""sampled_model""sampled_model""sampled_model" 值获取这些采样点。请注意,应避免使用对象模型中的异常点,因为它们会影响直径的准确性。减小 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 会增加采样点数量,从而使匹配结果更稳定但速度较慢。增大
RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 会减少采样点数量,从而使匹配结果稳定性降低但速度更快。
采样点用于通过 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 算子在场景中查找对象模型。为此,系统会检查点集中的所有可能点对,并计算每对点的距离及相对表面方向。这两个值均会被离散化并存储以供匹配。泛型参数
'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel" 和
'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution" 可用于分别设置距离和方向角的离散化(详见下文)。
为了进行姿态精化,会对三维对象模型进行第二次采样。第二次采样采用更小的采样距离,从而生成更多的点。泛型参数 'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance" 用于设置相对于对象直径的采样距离。减小该值可获得更精确的姿态精化结果,但会导致模型体积增大,且模型生成与匹配速度变慢。增大该值会导致姿态精化精度降低,但模型体积减小,且模型生成与匹配速度加快(见下文)。
基于表面的匹配还可以利用三维边缘来改善对齐效果。这对于平面对象或具有较大平面侧面的对象特别有用,因为此类对象常会以错误的旋转角度出现,或位于背景平面上。为了使 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 也能对齐边缘,必须通过将泛型参数
'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges" 设置为 'true'"true""true""true""true""true" 来训练表面模型。在此情况下,模型必须包含三角形或多边形网格,且点序列的排列顺序应确保法线指向内部。此外,支持边缘的基于表面的匹配训练需要 OpenGL 2.1、GLSL 1.2 以及 OpenGL 扩展 GL_EXT_framebuffer_object 和 GL_EXT_framebuffer_blit。请注意,与不支持边缘的情况相比,此类训练可能需要显著更长的时间。
此外,该模型还可以进行配置以支持基于视图的分数计算。这对于仅能看到三维对象模型一小部分的情况特别有用,因为如果使用与总点数之比来计算分数,会导致分数偏低。因此,基于视图的分数是通过匹配点数与特定视点下潜在可见模型点数最大值之比来计算的。为了使 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 能够计算基于视图的得分,必须通过将泛型参数
'train_view_based'"train_view_based""train_view_based""train_view_based""train_view_based""train_view_based" 设置为 'true'"true""true""true""true""true" 来对表面模型进行训练。与 'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges" 类似,模型必须包含一个三角形或多边形网格,且该网格中点的排列顺序应使得法线指向内部。
请注意,若使用噪声数据创建三维对象模型,将导致计算出的表面法线存在缺陷。特别是当模型需配合三维边界使用或支持基于视图的评分时,这可能会导致评分结果不可靠。为了减少三维数据中的噪声,您可以使用
smooth_object_model_3dsmooth_object_model_3dSmoothObjectModel3dSmoothObjectModel3dSmoothObjectModel3dsmooth_object_model_3d 或 simplify_object_model_3dsimplify_object_model_3dSimplifyObjectModel3dSimplifyObjectModel3dSimplifyObjectModel3dsimplify_object_model_3d 等算子。
泛型参数对 GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name 和 GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value
用于为模型生成设置额外参数。
GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name 包含待设置的参数名称元组,而 GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value 包含相应的值。GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name 可以取以下值:
- 'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals":
-
反转模型表面法线的方向。生成模型时需要已知法线方向。如果模型和场景是在相同的设置下获取的,法线将指向相同的方向。如果模型是从 CAD 文件加载的,法线可能指向相反的方向。若您遇到模型位于场景表面的“外部”且该模型由CAD文件创建的情况,请尝试将此参数设置为 'true'"true""true""true""true""true"。此外,请确保 CAD 文件中的法线均指向外部或内部,即方向保持一致。法线方向对表面模型的姿态精化无关紧要。因此,如果对象模型仅与 refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPoseRefineSurfaceModelPoserefine_surface_model_pose 算子一起使用,则
'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals" 的值对结果没有影响。
可能值: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"
默认值: 'false'"false""false""false""false""false"
- 'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance":
-
设置姿态精化时的采样距离,该距离以对象的直径为基准。减小该值可提高姿态精化的精度,但会导致模型体积增大,且模型生成与优化速度变慢。增大该值会降低姿态精化的精度,但模型体积会变小,且模型生成与匹配速度会加快。
建议值: 0.05, 0.02, 0.01,
0.005
默认值: 0.01
断言: 0 < 'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance" < 1
- 'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel":
-
设置点对距离相对于对象直径的离散化距离。该值默认为 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 的值。不建议更改此值。对于噪声很大的场景,可以增加该值以提高匹配处理噪声点时的稳健性。
建议值: 0.1, 0.05, 0.03
默认值:RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance 的值
断言: 0 < 'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel" < 1
- 'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution":
-
将点对方向的离散化设置为角度的细分次数。建议不要更改此值。增大该值会提高匹配精度,但会降低对错误法线方向的稳健性;减小该值会降低匹配精度,但会提高对错误法线方向的稳健性。对于噪声极大的场景(其中无法准确计算法线方向),该值可设置为 25 或 20。
建议值: 20, 25, 30
默认值: 30
断言: 'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution" > 1
- 'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges":
-
启用基于边缘支持的表面匹配与精化训练。在此情况下,模型必须包含网格,即三角形或多边形。此外,计算出的法向量必须指向内部。此参数需要 OpenGL 支持。
可能值: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"
默认值: 'false'"false""false""false""false""false"
- 'train_view_based'"train_view_based""train_view_based""train_view_based""train_view_based""train_view_based":
-
启用基于视图的分数计算训练,用于基于表面的匹配和精化。在此情况下,模型必须包含网格,即三角形或多边形。此外,计算出的法向量必须指向内部。此参数需要 OpenGL 支持。
可能值: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"
默认值: 'false'"false""false""false""false""false"
- 'train_self_similar_poses'"train_self_similar_poses""train_self_similar_poses""train_self_similar_poses""train_self_similar_poses""train_self_similar_poses":
-
为针对自相似、近对称姿态的优化准备表面模型。为此,会寻找那些模型自身非常相似的姿态,即仅能通过模型的极细微特征(如钻孔)加以区分、且可能被 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 混淆的姿态。调用 find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model 时,系统将自动确定这些自相似姿态中哪一个是正确的。
可能值: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"
默认值: 'false'"false""false""false""false""false"
执行信息
- 多线程类型:可重入(与非独占算子并行运行)。
- 多线程作用域:全局(可从任何线程调用)。
- 在内部数据级别上自动并行化。
此算子返回一个句柄。请注意,即使该句柄被用作特定算子的输入参数,这些算子仍可能改变此句柄类型的实例状态。
此算子支持取消超时和中断。
参数
ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3Dobject_model_3d (输入控制) object_model_3d → HObjectModel3D, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)
3D 对象模型的句柄。
RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistancerel_sampling_distance (输入控制) real → HTuplefloatHTupleHtuple (real) (double) (double) (double)
相对于对象直径的采样距离。
默认值:
0.03
建议值:
0.1, 0.05, 0.03, 0.02, 0.01
限制:
0 < RelSamplingDistance < 1
GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name (输入控制) attribute.name(-array) → HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)
泛型参数的名称。
默认值:
[]
建议值:
'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals", 'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance", 'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel", 'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution", 'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges", 'train_view_based'"train_view_based""train_view_based""train_view_based""train_view_based""train_view_based", 'train_self_similar_poses'"train_self_similar_poses""train_self_similar_poses""train_self_similar_poses""train_self_similar_poses""train_self_similar_poses"
GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value (输入控制) attribute.value(-array) → HTupleMaybeSequence[Union[str, float, int]]HTupleHtuple (string / real / integer) (string / double / int / long) (HString / double / Hlong) (char* / double / Hlong)
泛型参数的值。
默认值:
[]
建议值:
0, 1, 'true'"true""true""true""true""true", 'false'"false""false""false""false""false", 0.005, 0.01, 0.02, 0.05, 0.1
SurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDsurfaceModelIDsurface_model_id (输出控制) surface_model → HSurfaceModel, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)
表面模型的句柄。
结果
create_surface_modelcreate_surface_modelCreateSurfaceModelCreateSurfaceModelCreateSurfaceModelcreate_surface_model 在所有参数正确时返回 2 (H_MSG_TRUE)。如有必要,则抛出异常。
可能的前趋
read_object_model_3dread_object_model_3dReadObjectModel3dReadObjectModel3dReadObjectModel3dread_object_model_3d,
xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d,
get_object_model_3d_paramsget_object_model_3d_paramsGetObjectModel3dParamsGetObjectModel3dParamsGetObjectModel3dParamsget_object_model_3d_params,
surface_normals_object_model_3dsurface_normals_object_model_3dSurfaceNormalsObjectModel3dSurfaceNormalsObjectModel3dSurfaceNormalsObjectModel3dsurface_normals_object_model_3d
可能的后继
find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model,
refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPoseRefineSurfaceModelPoserefine_surface_model_pose,
get_surface_model_paramget_surface_model_paramGetSurfaceModelParamGetSurfaceModelParamGetSurfaceModelParamget_surface_model_param,
write_surface_modelwrite_surface_modelWriteSurfaceModelWriteSurfaceModelWriteSurfaceModelwrite_surface_model,
clear_surface_modelclear_surface_modelClearSurfaceModelClearSurfaceModelClearSurfaceModelclear_surface_model,
set_surface_model_paramset_surface_model_paramSetSurfaceModelParamSetSurfaceModelParamSetSurfaceModelParamset_surface_model_param
替代
read_surface_modelread_surface_modelReadSurfaceModelReadSurfaceModelReadSurfaceModelread_surface_model
另见
find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model,
refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPoseRefineSurfaceModelPoserefine_surface_model_pose,
read_surface_modelread_surface_modelReadSurfaceModelReadSurfaceModelReadSurfaceModelread_surface_model,
write_surface_modelwrite_surface_modelWriteSurfaceModelWriteSurfaceModelWriteSurfaceModelwrite_surface_model,
clear_surface_modelclear_surface_modelClearSurfaceModelClearSurfaceModelClearSurfaceModelclear_surface_model,
set_surface_model_paramset_surface_model_paramSetSurfaceModelParamSetSurfaceModelParamSetSurfaceModelParamset_surface_model_param
参考文献
Bertram Drost, Markus Ulrich, Nassir Navab, Slobodan Ilic: “Model
Globally, Match Locally: Efficient and Robust 3D Object Recognition.”
Computer Vision and Pattern Recognition, pp. 998-1005, 2010.
模块
三维计量