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',则返回结果句柄;否则不返回结果句柄。
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)