3D Matching:实现halcon中的find_surface_model

        halcon中的三维匹配大致分为两类,一类是基于形状的(Shape-Based),一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体,3D物体模型必须是CAD模型,且几何边缘清晰可见,使用的相机也要预先进行校准。基于表面的匹配可用于3D场景中快速定位复杂的3D物体,比如在点云中寻找物体,模型可以从CAD或3D传感器中获得,可以包含光滑的表面,基于表面的匹配也称为“体积匹配”。

halcon中的surface matching

        halcon中surface matching参考文献为:Model Globally, Match Locally: Efficient and Robust 3D Object Recognition,该方法已申请专利。通常我们只要知道模型中的三个点,以及其在场景中对应的三个点就可以确定位姿,如果每个点都有一个方向,那么只需要一组对应点和转动角度就能确定位姿。文献中定义了PPF(point pair feature)这样的特征矢量,在创建模板时计算每个特征点与其他特征点的PPF,构建哈希表,将具有相同 feature 的 point pair 放在一起,在匹配时从场景中选取一部分关键点,将每个关键点与其他场景点计算PPF,根据存储好的哈希表对模型点和转动角度进行反向投票,超过设定分数就认为找到了模型的point pair,根据模型点和转动角度算出变换矩阵得到初始位姿,再用ICP求精。

        基于PPF的surface matching网上有很多文章,GitHub上有很多开源实现,opencv中也实现了该算法,对于算法的原理我不再详细

Halcon中,`create_surface_model` 算子用于创建一个基于表面的匹配模型,以便进行3D对象识别。该算子是实现曲面匹配Surface-Based Matching)的关键步骤之一,它基于给定的3D对象模型生成可用于后续匹配操作的数据结构 [^4]。 ### 参数说明 以下是 `create_surface_model` 的参数列表及其详细说明: #### 输入参数 - **ObjectModel3D**: 这是一个3D对象模型句柄,表示输入的三维几何数据。此模型可以是从文件读取的CAD模型(例如使用 `read_object_model_3d`),也可以是由点云数据转换而来的模型(例如通过 `xyz_to_object_model_3d` 创建)。模型必须包含点和法线信息才能正确生成表面模型 [^3]。 - **RelSamplingDistance**: 表示采样距离的相对值,用于控制模型表面特征的采样密度。较小的值会增加采样点数量,提高精度但也会增加计算开销;较大的值则相反。通常建议根据目标物体的尺寸和所需的匹配精度进行调整。 - **GenParamName**: 通用参数名称,用于指定需要设置的特定参数名。这些参数可用于控制模型创建过程中的某些行为或特性。例如,可以设置 `'num_levels'` 来定义金字塔层级数,或者 `'min_score'` 来设定匹配时的最小得分阈值等。 - **GenParamValue**: 与 `GenParamName` 对应的参数值,用于具体配置相关参数的行为。例如,若 `GenParamName` 设置为 `'num_levels'`,则 `GenParamValue` 可能设置为 `5`,表示构建五层金字塔模型以提升效率和鲁棒性。 #### 输出参数 - **SurfaceModelID**: 返回创建好的表面模型的句柄,后续的匹配操作(如 `find_surface_model`)将使用该句柄作为输入参数。此句柄必须在使用完毕后通过 `clear_surface_model` 显式释放资源 [^2]。 ### 使用方法 1. **准备3D对象模型** 首先确保已有一个有效的3D对象模型句柄。可以通过以下方式之一获取: - 从文件加载:`read_object_model_3d` - 由点云数据转换:`xyz_to_object_model_3d` 2. **调用 create_surface_model** 使用上述准备好的 `ObjectModel3D` 和适当的参数调用该算子,生成表面模型句柄 `SurfaceModelID`。 示例代码如下: ```hdevelop * 假设已经通过 read_object_model_3d 或其他方式获得了一个 3D 对象模型 ObjectModel3D := 'path/to/model.obj' * 创建表面模型 RelSamplingDistance := 0.05 GenParamName := ['num_levels', 'min_score'] GenParamValue := [5, 0.7] create_surface_model(ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue, SurfaceModelID) ``` 3. **可选:设置额外参数** 若需进一步定制表面模型的行为,可使用 `set_surface_model_param` 设置更多参数,例如限制匹配时的最大旋转角度差 `'pose_restriction_max_angle_diff'` [^1]。 4. **执行匹配操作** 使用 `find_surface_model` 并传入 `SurfaceModelID` 来在场景中查找该模型的位置。 5. **清理资源** 匹配完成后,务必调用 `clear_surface_model(SurfaceModelID)` 释放内存资源 。 ### 注意事项 - 创建表面模型的前提是3D对象模型必须包含点和法线信息。支持的组合包括: - 点和点法线; - 点和三角形或多边形网格(如CAD文件); - 点和2D映射(如XYZ图像转换结果)[^3]。 - 参数 `RelSamplingDistance` 应根据实际应用需求进行合理设置,以平衡精度与性能。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值