4 Simple example of stereo image matching and point cloud generation.
6 Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net/ )
14 element vertex %(vert_num)d
24 def write_ply(fn, verts, colors):
25 verts = verts.reshape(-1, 3)
26 colors = colors.reshape(-1, 3)
27 verts = np.hstack([verts, colors])
28 with open(fn, 'w') as f:
29 f.write(ply_header % dict(vert_num=len(verts)))
30 np.savetxt(f, verts, '%f %f %f %d %d %d')
33 if __name__ == '__main__':
34 print 'loading images...'
35 imgL = cv2.pyrDown( cv2.imread('../gpu/aloeL.jpg') ) # downscale images for faster processing
36 imgR = cv2.pyrDown( cv2.imread('../gpu/aloeR.jpg') )
38 # disparity range is tuned for 'aloe' image pair
41 num_disp = 112-min_disp
42 stereo = cv2.StereoSGBM(minDisparity = min_disp,
43 numDisparities = num_disp,
44 SADWindowSize = window_size,
46 speckleWindowSize = 100,
49 P1 = 8*3*window_size**2,
50 P2 = 32*3*window_size**2,
54 print 'computing disparity...'
55 disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
57 print 'generating 3d point cloud...',
59 f = 0.8*w # guess for focal length
60 Q = np.float32([[1, 0, 0, -0.5*w],
61 [0,-1, 0, 0.5*h], # turn points 180 deg around x-axis,
62 [0, 0, 0, -f], # so that y-axis looks up
64 points = cv2.reprojectImageTo3D(disp, Q)
65 colors = cv2.cvtColor(imgL, cv2.COLOR_BGR2RGB)
66 mask = disp > disp.min()
67 out_points = points[mask]
68 out_colors = colors[mask]
70 write_ply('out.ply', out_points, out_colors)
71 print '%s saved' % 'out.ply'
73 cv2.imshow('left', imgL)
74 cv2.imshow('disparity', (disp-min_disp)/num_disp)
76 cv2.destroyAllWindows()