mayavi2:来自data_set_clipper过滤器的pythonic访问

时间:2014-11-21 16:53:30

标签: python data-visualization vtk mayavi

我已将矩形棱镜滤镜应用于我的点云数据,并希望访问棱镜中包含的数据。这似乎应该很简单,可能就是。

我创建了剪辑器并进行了调整

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经验的人有一些见解。

1 个答案:

答案 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