我已将矩形棱镜滤镜应用于我的点云数据,并希望访问棱镜中包含的数据。这似乎应该很简单,可能就是。
我创建了剪辑器并进行了调整
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经验的人有一些见解。
答案 0 :(得分:0)
在发现VTK docs比mayavi docs更有用之后,我想出了一种从剪切棱镜中提取角落的方法。仍然需要进行多边形点测试。更新:想出其余部分。可能有很多方法可以优化 - 这是最天真的解决方案。希望有人能从中受益。
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