Halcon 3D表面匹配

文章目录

  • [create_surface_model 创建匹配模型](#create_surface_model 创建匹配模型)
  • [find_surface_model 查找3D模型](#find_surface_model 查找3D模型)
  • [get_surface_matching_result 获取曲面匹配结果的详细信息](#get_surface_matching_result 获取曲面匹配结果的详细信息)
  • 示例

create_surface_model 创建匹配模型

c 复制代码
create_surface_model( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)
### ObjectModel3D (输入控制)
- **类型**: 整数数组
- **描述**: 3D对象模型的句柄。
- **解释**:
  - 这个参数是一个整数数组,表示一个或多个3D对象模型的句柄。通过这些句柄,可以访问和操作这些3D对象模型。

### GenParamName (输入控制)
- **类型**: 字符串数组
- **描述**: 查询的3D对象模型的通用属性的名称。
- **默认值**: 'num_points'
- **可选值**:
  - 'blue': 蓝色通道的值。
  - 'bounding_box1': 轴对齐的边界框。
  - 'center': 对象的中心点。
  - 'diameter_axis_aligned_bounding_box': 轴对齐边界框的直径。
  - 'extended_attribute_names': 扩展属性的名称。
  - 'green': 绿色通道的值。
  - 'has_distance_computation_data': 是否包含距离计算数据。
  - 'has_extended_attribute': 是否包含扩展属性。
  - 'has_lines': 是否包含线条。
  - 'has_point_normals': 是否包含点法线。
  - 'has_points': 是否包含点。
  - 'has_polygons': 是否包含多边形。
  - 'has_primitive_data': 是否包含原始数据。
  - 'has_primitive_rms': 是否包含原始数据的均方根误差。
  - 'has_segmentation_data': 是否包含分割数据。
  - 'has_shape_based_matching_3d_data': 是否包含基于形状的3D匹配数据。
  - 'has_surface_based_matching_data': 是否包含基于表面的匹配数据。
  - 'has_triangles': 是否包含三角形。
  - 'has_xyz_mapping': 是否包含XYZ映射。
  - 'lines': 线条数据。
  - 'mapping_col': 映射列。
  - 'mapping_row': 映射行。
  - 'neighbor_distance': 邻居距离。
  - 'num_extended_attribute': 扩展属性的数量。
  - 'num_lines': 线条的数量。
  - 'num_neighbors': 邻居的数量。
  - 'num_neighbors_fast': 快速计算的邻居数量。
  - 'num_points': 点的数量。
  - 'num_polygons': 多边形的数量。
  - 'num_primitive_parameter_extension': 原始参数扩展的数量。
  - 'num_triangles': 三角形的数量。
  - 'point_coord_x': 点的X坐标。
  - 'point_coord_y': 点的Y坐标。
  - 'point_coord_z': 点的Z坐标。
  - 'point_normal_x': 点法线的X分量。
  - 'point_normal_y': 点法线的Y分量。
  - 'point_normal_z': 点法线的Z分量。
  - 'polygons': 多边形数据。
  - 'primitive_parameter': 原始参数。
  - 'primitive_parameter_extension': 原始参数扩展。
  - 'primitive_parameter_pose': 原始参数姿态。
  - 'primitive_pose': 原始姿态。
  - 'primitive_rms': 原始数据的均方根误差。
  - 'primitive_type': 原始类型。
  - 'red': 红色通道的值。
  - 'reference_point': 参考点。
  - 'score': 分数。
  - 'triangles': 三角形数据。
- **解释**:
  - 这个参数指定要查询的3D对象模型的通用属性的名称。通过这些名称,可以获取相应的属性值。

### GenParamValue (输出控制)
- **类型**: 字符串/整数/实数数组
- **描述**: 通用参数的值。
- **解释**:
  - 这个参数是一个数组,包含查询的通用属性的值。根据查询的属性名称,返回相应的字符串、整数或实数值。

find_surface_model 查找3D模型

c 复制代码
find_surface_model( : : SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID)
### SurfaceModelID (输入控制)
- **类型**: 整数
- **描述**: 表面模型的句柄。
- **解释**:
  - 这个参数是一个整数,表示表面模型的句柄。通过这个句柄,可以访问和操作表面模型。

### ObjectModel3D (输入控制)
- **类型**: 整数
- **描述**: 包含场景的3D对象模型的句柄。
- **解释**:
  - 这个参数是一个整数,表示包含场景的3D对象模型的句柄。通过这个句柄,可以访问和操作场景。

### RelSamplingDistance (输入控制)
- **类型**: 实数
- **描述**: 相对于表面模型直径的场景采样距离。
- **默认值**: 0.05
- **建议值**: 0.1, 0.07, 0.05, 0.04, 0.03
- **限制**: 0 < RelSamplingDistance < 1
- **解释**:
  - 这个参数指定相对于表面模型直径的场景采样距离。通过这个值,可以控制场景采样的密度。

### KeyPointFraction (输入控制)
- **类型**: 实数
- **描述**: 用作关键点的采样场景点的比例。
- **默认值**: 0.2
- **建议值**: 0.3, 0.2, 0.1, 0.05
- **限制**: 0 < KeyPointFraction <= 1
- **解释**:
  - 这个参数指定用作关键点的采样场景点的比例。通过这个值,可以控制关键点的数量。

### MinScore (输入控制)
- **类型**: 实数/整数
- **描述**: 返回姿态的最小分数。
- **默认值**: 0
- **限制**: MinScore >= 0
- **解释**:
  - 这个参数指定返回姿态的最小分数。通过这个值,可以筛选出符合分数要求的姿态。

### ReturnResultHandle (输入控制)
- **类型**: 字符串
- **描述**: 在SurfaceMatchingResultID中启用返回结果句柄。
- **默认值**: 'false'
- **建议值**: 'true', 'false'
- **解释**:
  - 这个参数指定是否在SurfaceMatchingResultID中返回结果句柄。如果设置为'true',则返回结果句柄;如果设置为'false',则不返回结果句柄。

### GenParamName (输入控制)
- **类型**: 字符串数组
- **描述**: 通用参数的名称。
- **默认值**: []
- **可选值**:
  - '3d_edge_min_amplitude_abs': 3D边缘最小振幅绝对值。
  - '3d_edge_min_amplitude_rel': 3D边缘最小振幅相对值。
  - '3d_edges': 3D边缘。
  - 'dense_pose_refinement': 密集姿态优化。
  - 'max_overlap_dist_abs': 最大重叠距离绝对值。
  - 'max_overlap_dist_rel': 最大重叠距离相对值。
  - 'num_matches': 匹配数量。
  - 'pose_ref_dist_threshold_abs': 姿态优化距离阈值绝对值。
  - 'pose_ref_dist_threshold_rel': 姿态优化距离阈值相对值。
  - 'pose_ref_num_steps': 姿态优化步数。
  - 'pose_ref_scoring_dist_abs': 姿态优化评分距离绝对值。
  - 'pose_ref_scoring_dist_rel': 姿态优化评分距离相对值。
  - 'pose_ref_sub_sampling': 姿态优化子采样。
  - 'pose_ref_use_scene_normals': 姿态优化使用场景法线。
  - 'scene_normal_computation': 场景法线计算。
  - 'score_type': 评分类型。
  - 'sparse_pose_refinement': 稀疏姿态优化。
  - 'viewpoint': 视点。
- **解释**:
  - 这个参数指定通用参数的名称。通过这些参数,可以进一步控制表面匹配的过程。

### GenParamValue (输入控制)
- **类型**: 字符串/实数/整数数组
- **描述**: 通用参数的值。
- **默认值**: []
- **建议值**: 0, 1, 'true', 'false', 0.005, 0.01, 0.03, 0.05, 0.1, 'num_scene_points', 'model_point_fraction', 'num_model_points', 'fast', 'mls'
- **解释**:
  - 这个参数指定通用参数的值。通过这些值,可以进一步控制表面匹配的过程。

### Pose (输出控制)
- **类型**: 实数/整数数组
- **描述**: 表面模型在场景中的3D姿态。
- **解释**:
  - 这个参数是一个包含3D姿态的数组。每个姿态描述了表面模型在场景中的位置和方向。

### Score (输出控制)
- **类型**: 实数数组
- **描述**: 找到的表面模型实例的分数。
- **解释**:
  - 这个参数是一个实数数组,包含找到的表面模型实例的分数。每个分数对应一个表面模型实例。

### SurfaceMatchingResultID (输出控制)
- **类型**: 整数数组
- **描述**: 匹配结果的句柄,如果ReturnResultHandle设置为'true'。
- **解释**:
  - 这个参数是一个整数数组,表示匹配结果的句柄。如果ReturnResultHandle设置为'true',则返回结果句柄;否则不返回结果句柄。

get_surface_matching_result 获取曲面匹配结果的详细信息

c 复制代码
get_surface_matching_result( : : SurfaceMatchingResultID, ResultName, ResultIndex : ResultValue)
### SurfaceMatchingResultID (输入控制)
- **类型**: 整数
- **描述**: 表面匹配结果的句柄。
- **解释**:
  - 这个参数是一个整数,表示表面匹配结果的句柄。通过这个句柄,可以访问和操作表面匹配结果。

### ResultName (输入控制)
- **类型**: 字符串数组
- **描述**: 结果属性的名称。
- **默认值**: 'pose'
- **可选值**:
  - 'key_points': 关键点。
  - 'pose': 姿态。
  - 'sampled_3d_edges': 采样的3D边缘。
  - 'sampled_scene': 采样的场景。
  - 'score_refined': 优化后的分数。
  - 'score_unrefined': 未优化的分数。
- **解释**:
  - 这个参数指定要查询的结果属性的名称。通过这些名称,可以获取相应的属性值。

### ResultIndex (输入控制)
- **类型**: 整数
- **描述**: 匹配结果的索引,从0开始。
- **默认值**: 0
- **建议值**: 0, 1, 2, 3
- **限制**: ResultIndex >= 0
- **解释**:
  - 这个参数指定匹配结果的索引。索引从0开始,表示第一个匹配结果。通过这个索引,可以访问特定的匹配结果。

### ResultValue (输出控制)
- **类型**: 整数/字符串/实数数组
- **描述**: 结果属性的值。
- **解释**:
  - 这个参数是一个数组,包含查询的结果属性的值。根据查询的属性名称,返回相应的整数、字符串或实数值。

示例

c 复制代码
* ***********************************************************************
* Example for Surface-Based 3D Matching
* 
* This example shows Surface-Based 3D Matching on data taken with a
* Time-of-flight camera (TOF/PMD).
* The model for the matching is created from a reference view of the
* object, i.e., no CAD model is used.
* The created model is then searched for in a number of 3D scenes.
* 
* The example demonstrates how to use the operators
*   xyz_to_object_model_3d,
*   create_surface_model, and
*   find_surface_model.
* 
* ***********************************************************************
* 
* Initialization
dev_update_off ()
gen_empty_obj (EmptyObject)
ImagePath := 'time_of_flight/'
dev_close_window ()
* 
* ***********************************************************************
* Offline-Phase: Model generation from a reference XYZ Image
* ***********************************************************************
* 
* Load the XYZ images with the reference object
* 读取图片
read_image (Image, ImagePath + 'engine_cover_xyz_01')
* 分成3通道
decompose3 (Image, Xm, Ym, Zm)
* Remove the background plane
* 阈值处理
threshold (Zm, ModelZ, 0, 650)
* Find connected regions
* 分割
connection (ModelZ, ConnectedModel)
* Select the regions for the ROI of the reference model
* 选择物体
select_obj (ConnectedModel, ModelROI, [10,9])
* 进行联合
union1 (ModelROI, ModelROI)
* Create the ROI
* 裁剪获取Xm
reduce_domain (Xm, ModelROI, Xm)
* 
* Display model image and ROI
dev_open_window_fit_image (Zm, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Zm)
dev_set_line_width (2)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (ModelROI)
disp_message (WindowHandle, 'Create surface model from XYZ image region', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
* 
* Create the surface model from the reference view
* 将3D点转换为3D模型
xyz_to_object_model_3d (Xm, Ym, Zm, ObjectModel3DModel)
visualize_object_model_3d(WindowHandle, ObjectModel3DModel, [], [], [], [], [], [], [], PoseOut1)
* 创建匹配模型
create_surface_model (ObjectModel3DModel, 0.03, [], [], SFM)
* 
* Display the model
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
Message := 'Surface model'
visualize_object_model_3d (WindowHandle, ObjectModel3DModel, [], [], [], [], Message, [], Instructions, PoseOut)
* 
* ***********************************************************************
* Online-Phase: Match the reference object in 3D scenes
* ***********************************************************************
* 
NumImages := 10
for Index := 2 to NumImages by 1
    * ***************************************
    * Acquire scene
    * ***************************************
    * Load the XYZ Images
    read_image (Image, ImagePath + 'engine_cover_xyz_' + Index$'02')
    decompose3 (Image, X, Y, Z)
    * Remove the background plane to increase the speed and
    * robustness of the surface-based matching
    threshold (Z, SceneGood, 0, 666)
    reduce_domain (X, SceneGood, XReduced)
    xyz_to_object_model_3d (XReduced, Y, Z, ObjectModel3DSceneReduced)
    * 
    * ***************************************
    * Match: Find the reference model in the
    *        3D scene
    * ***************************************
    count_seconds (T0)
    find_surface_model (SFM, ObjectModel3DSceneReduced, 0.05, 0.3, 0.2, 'true', 'num_matches', 10, Pose, Score, SurfaceMatchingResultID)
    count_seconds (T1)
    TimeForMatching := (T1 - T0) * 1000
    * 
    * ***************************************
    * Display: Visualize the result(s)
    * ***************************************
    * Prepare the visualization of the result(s)
    ObjectModel3DResult := []
    for Index2 := 0 to |Score| - 1 by 1
        if (Score[Index2] < 0.11)
            continue
        endif
        * 获取位姿
        CPose := Pose[Index2 * 7:Index2 * 7 + 6]
        * 放射运算
        rigid_trans_object_model_3d (ObjectModel3DModel, CPose, ObjectModel3DRigidTrans)
        ObjectModel3DResult := [ObjectModel3DResult,ObjectModel3DRigidTrans]
    endfor
    *visualize_object_model_3d(WindowHandle, ObjectModel3DRigidTrans, [], Pose, [], [], [], [], [], PoseOut2)
    * 
    xyz_to_object_model_3d (X, Y, Z, ObjectModel3DScene)
    * 
    * Visualize matching scene and key points
    Message := 'Original scene points (white)'
    Message[1] := 'Sampled scene points (cyan)'
    Message[2] := 'Key points (yellow)'
    * 获取采样场景
    get_surface_matching_result (SurfaceMatchingResultID, 'sampled_scene', [], SampledScene)
    * 获取关键点
    get_surface_matching_result (SurfaceMatchingResultID, 'key_points', [], KeyPoints)
 
    dev_clear_window ()
    visualize_object_model_3d (WindowHandle, [ObjectModel3DScene,SampledScene,KeyPoints], [], [], ['color_' + [0,1,2],'point_size_' + [0,1,2]], ['gray','cyan','yellow',1.0,3.0,5.0], Message, [], Instructions, PoseOut)
    * 
    * Visualize result(s)
    Message := 'Scene: ' + Index
    Message[1] := 'Found ' + |ObjectModel3DResult| + ' object(s) in ' + TimeForMatching$'.3' + ' ms'
    ScoreString := sum(Score$'.2f' + ' / ')
    Message[2] := 'Score(s): ' + ScoreString{0:strlen(ScoreString) - 4}
    NumResult := |ObjectModel3DResult|
    tuple_gen_const (NumResult, 'green', Colors)
    tuple_gen_const (NumResult, 'circle', Shapes)
    tuple_gen_const (NumResult, 3, Radii)
    Indices := [1:NumResult]
    * 
    dev_clear_window ()
    *显示匹配结果
    visualize_object_model_3d (WindowHandle, [ObjectModel3DScene,ObjectModel3DResult], [], PoseOut, ['color_' + [0,Indices],'point_size_0'], ['gray',Colors,1.0], Message, [], Instructions, PoseOut)
    * 
    * ***************************************
    * Clear: Free result(s) 清除句柄
    * ***************************************
    clear_object_model_3d (ObjectModel3DSceneReduced)
    clear_object_model_3d (ObjectModel3DScene)
    clear_object_model_3d (ObjectModel3DResult)
    clear_object_model_3d (SampledScene)
    clear_object_model_3d (KeyPoints)
    clear_surface_matching_result (SurfaceMatchingResultID)
endfor
clear_object_model_3d (ObjectModel3DModel)
clear_surface_model (SFM)
相关推荐
坠金21 小时前
【3D】基础概念
3d
小白菜学前端21 小时前
ThreeJS创建一个3D物体的基本流程
3d·three.js
梦想的理由1 天前
3D人体建模的前沿探索:细数主流模型与技术进展
3d
穷人小水滴2 天前
编写 blender python 扩展 (extension / addon)
python·3d·开源·blender·扩展
海上彼尚2 天前
根据JSON绘制3D地区
前端·3d·js
莫问alicia2 天前
echarts 实现3D饼状图 加 label标签显示
前端·3d·echarts·swift
天人合一peng2 天前
20191010-COMIND_2019_1015---3DGAM审核
3d
海上彼尚2 天前
3D区块渐变围栏
前端·javascript·vue.js·3d
LeapMay3 天前
3D Gaussian Splatting代码详解(二):模型构建
pytorch·python·3d