如何计算目标网格与基准网格(Ground Truth)的形状相似度?
网格形状相似度计算方案
核心思路
直接基于网格的拓扑与几何特征完成计算,替代点云采样的间接方法,最终输出百分比形式的相似度结果。
具体实现方法
1. 预处理:网格配准
- 先做刚性配准(比如ICP的网格适配版本,或FPFH特征匹配后优化),确保两个网格处于同一坐标系,消除平移、旋转带来的差异,这是后续计算的基础。
- 若存在非刚性形变(比如苹果的轻微挤压变形),需用非刚性配准算法对齐对应顶点。
2. 基于几何距离的相似度计算
- 双向豪斯多夫距离:计算两个网格表面点之间的距离,用平均距离替代最大距离避免极端点干扰,再归一化得到相似度:
相似度 = (1 - (平均豪斯多夫距离 / 基准网格直径)) * 100% - 逐面/顶点距离统计:
- 分别对基准网格的每个面、mesh2的每个面,计算对方网格中最近点的距离
- 统计所有距离的平均值,结合基准网格的特征尺寸转化为百分比:
相似度 = (1 - (平均距离 / 基准网格特征尺寸)) * 100%
3. 基于拓扑与特征的相似度计算
- 全局形状特征匹配:提取两个网格的旋转不变形状描述符(比如形状直径函数SDF),计算特征向量的余弦相似度,直接转化为百分比。
- 拓扑一致性校验:若两个网格拓扑结构一致(顶点/面数量接近、连接关系匹配),可计算对应顶点的欧氏距离均值,再归一化得到相似度。
4. 代码示例(Python + trimesh)
import trimesh # 加载网格文件 gt_mesh = trimesh.load("ground_truth_apple.stl") mesh2 = trimesh.load("mesh2_apple.stl") # 刚性配准对齐 transform, _ = trimesh.registration.icp(mesh2, gt_mesh) mesh2.apply_transform(transform) # 计算平均距离 avg_distance = trimesh.signed_distance(mesh2, gt_mesh).abs().mean() # 获取基准网格的直径作为归一化参考 gt_diameter = gt_mesh.bounding_box.extents.max() # 计算相似度百分比 similarity = (1 - (avg_distance / gt_diameter)) * 100 print(f"形状相似度:{similarity:.2f}%")
注意事项
- 若两个网格分辨率差异较大,先对低分辨率网格做细分处理,保证采样密度一致。
- 非刚性形变场景下,必须先完成非刚性配准对齐,再进行距离计算。
- 可结合多种方法的结果取平均值,提升结果的鲁棒性。
内容的提问来源于stack exchange,提问作者GOPI KRISHNA
相关产品推荐
相关产品推荐

