我使用 Pymeshlab 中的过滤器compute_mls_projection_apss 将网格的细分版本投影到其原始原始网格上。如果我在 Meshlab 上执行此操作(过滤器 --> 点集 --> MLS 投影 (APSS),选项:过滤器比例 = 1),则效果很好。但是当在 Pymeshlab 版本上执行相同的操作时,结果有很多尖峰伪影。造成此问题的原因是什么以及如何解决?或者,如果您知道 MLS 投影的其他可用实现,请告诉我。预先感谢您!
以下是我使用的代码:
import pymeshlab as pml
layers = pml.MeshSet()
# subdiv
layers.load_new_mesh("DFAUST_f_1024_subdiv.ply")
# ground truth
layers.load_new_mesh("DFAUST_f_1024.ply")
layers.compute_mls_projection_apss(controlmesh=1, proxymesh=0, filterscale = 1.000000)
layers.set_current_mesh(0)
layers.save_current_mesh("DFAUST_f_1024_proj.ply")
您可以在这个谷歌驱动器文件夹中找到重现此问题的网格: https://drive.google.com/drive/folders/1r90E5toloGAFdURjOCyprORqFc9wJitf?usp=sharing
我尝试将网格顶点的数据类型更改为 double、float32、float64,但伪像仍然存在,因为我相信 Pymeshlab 和 Meshlab 使用不同的浮点精度:
import pymeshlab as pml
import igl
import numpy as np
layers = pml.MeshSet()
# subdiv
v, f = igl.read_triangle_mesh("DFAUST_f_1024_subdiv.ply")
subdiv_mesh = pml.Mesh(v.astype(np.double), f.astype(np.uint32))
layers.add_mesh(subdiv_mesh)
# ground truth
v, f = igl.read_triangle_mesh("DFAUST_f_1024.ply")
raw_mesh = pml.Mesh(v.astype(np.double), f.astype(np.uint32))
layers.add_mesh(raw_mesh)
layers.compute_mls_projection_apss(controlmesh=1, proxymesh=0, filterscale = 1.000000)
layers.set_current_mesh(0)
layers.save_current_mesh("DFAUST_f_1024_proj_double.ply")
我最终实现了一个用于 APSS 投影的 python 版本。
这是github代码: https://github.com/luongthecong123/APSS-Projection