~mrol-dev/mrol/trunk

« back to all changes in this revision

Viewing changes to mrol_mapping/pointcloud.py

  • Committer: Vikas Dhiman
  • Date: 2012-11-16 19:59:46 UTC
  • Revision ID: vikasdhi@buffalo.edu-20121116195946-fwfdqevt3h3eqoyg
Manually added julians changes after merge failed. "Added function to save point cloud in the .ply format"; "Got speed_test working again after API changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
58
58
    return PointCloud(X[:,:X.shape[1]])
59
59
    
60
60
def save(fname, xyzs, text=False):
61
 
    '''Save a point cloud to disk. By default it is saved as a numpy 
 
61
    '''Save a points in Nx3 arrays to disk. By default it is saved as a numpy 
62
62
    binary array, but it can be saved as plain text by setting the 
63
63
    'text' flag'''
64
64
    if text:
66
66
    else:
67
67
        np.save(fname,xyzs)
68
68
 
 
69
def save_ply(fname, xyzs):
 
70
    ''' Save points in Nx3 arrays as .ply Polygon File Format.  This format is
 
71
    popular and can be loaded by programs such as blender, meshlab and the
 
72
    point cloud library. '''
 
73
 
 
74
    header = '''ply
 
75
format ascii 1.0
 
76
element vertex %d
 
77
property float x
 
78
property float y
 
79
property float z
 
80
end_header
 
81
''' % len(xyzs)
 
82
 
 
83
    # TODO new version of numpy.savetxt will support header option
 
84
    F = open(fname, 'w')
 
85
    F.write(header)
 
86
    for x, y, z in xyzs:
 
87
        F.write('%.03f %.03f %.03f\n' % (x, y, z))
 
88
    return
 
89
 
69
90
class PointCloud:
70
91
    # TODO point clouds should be stored as ints in millimetres?
71
92
 
114
135
    def save(self, filename):
115
136
        save(filename, self.points)
116
137
 
 
138
    def save_ply(self, filename):
 
139
        save_ply(filename, self.points)
 
140
 
117
141
    # TODO: pose transform operator, may make addition/subtraction of 3x1 array redundant?
118
142
        
119
143
    def add_points(self, arr, timestamp=0):
127
151
            self.RGB = True                
128
152
        self.timestamp = timestamp
129
153
 
130
 
    def display(self, color=None, title=''):
 
154
    def display(self, color=None, title='', scene=None):
 
155
        ''' Displays the point cloud in a visual window.  To display in an
 
156
        existing window supply visual scene object like the one returned by
 
157
        this function. '''
131
158
        import visual # import here only if needed
132
159
        # import here to avoid circular dependency
133
160
        import mrol_mapping.visualiser.dispxyz as dispxyz
138
165
                color = self.points[:,3:6]/np.max(self.points[:,3:6])
139
166
        else:
140
167
            xyzs = self.points
141
 
        scene = visual.display(title=title + 'dispxyz')
 
168
 
 
169
        if scene is None:
 
170
            scene = visual.display(title=title + 'dispxyz')
142
171
 
143
172
        #scene.exit = False
144
173
        MT = dispxyz.EnableMouseThread(scene)