我已经对我的点云数据应用了一个矩形棱镜过滤器,并希望访问棱镜中包含的数据。这似乎应该很简单,而且可能是。
我已经创建了剪刀并对其进行了调整
p3d = view_ply_file('data/my_file.ply') #returns mayavi.mlab.points3d() instance
clip = mlab.pipeline.data_set_clipper(p3d)
#... manual interactive GUI adjustment
clip.outputs[0].points #? is empty.
如何检索包含的点?我目前正在研究底层的 vtk API,但也许具有 VTK 或 mayavi 经验的人有一些见解。
在发现 VTK 文档比 mayavi 文档更有用之后,我想出了一种方法来从剪报棱镜中提取角落。仍然需要进行面中点测试。更新:想通了其余的。可能有很多优化方法 - 这是最天真的解决方案。希望有人能从中受益。
def get_clip_corners(clip):
hack_mesh = tvtk.api.tvtk.PolyData()
clip.widget.widget._vtk_obj.GetPolyData(hack_mesh._vtk_obj)
corners = hack_mesh.points.to_array()[:8, :]
return corners, hack_mesh
def get_inside_mask(sep, data):
is_in = numpy.zeros((data.shape[0],), dtype = numpy.bool)
for (di, d) in enumerate(data):
di_in = sep.is_inside_object(d[0], d[1], d[2])
is_in[di] = di_in
return is_in
def extract_points_inside_clip(clip, data):
corners, mesh = get_clip_corners(clip)
sep = tvtk.api.tvtk.SelectEnclosedPoints()
sep.initialize(mesh)
is_in = get_inside_mask(sep, data)
data_in_box = data[is_in, :]
return data_in_box