fork download
  1. #!/usr/bin/env python
  2.  
  3.  
  4.  
  5. '''
  6.  
  7. Simple example of stereo image matching and point cloud generation.
  8.  
  9.  
  10.  
  11. Resulting .ply file cam be easily viewed using MeshLab ( http://m...content-available-to-author-only...e.net/ )
  12.  
  13. '''
  14.  
  15.  
  16.  
  17. import numpy as np
  18.  
  19. import cv2
  20.  
  21.  
  22.  
  23. ply_header = '''ply
  24.  
  25. format ascii 1.0
  26.  
  27. element vertex %(vert_num)d
  28.  
  29. property float x
  30.  
  31. property float y
  32.  
  33. property float z
  34.  
  35. property uchar red
  36.  
  37. property uchar green
  38.  
  39. property uchar blue
  40.  
  41. end_header
  42.  
  43. '''
  44.  
  45.  
  46.  
  47. def write_ply(fn, verts, colors):
  48.  
  49. verts = verts.reshape(-1, 3)
  50.  
  51. colors = colors.reshape(-1, 3)
  52.  
  53. verts = np.hstack([verts, colors])
  54.  
  55. with open(fn, 'w') as f:
  56.  
  57. f.write(ply_header % dict(vert_num=len(verts)))
  58.  
  59. np.savetxt(f, verts, '%f %f %f %d %d %d')
  60.  
  61.  
  62.  
  63.  
  64.  
  65. if __name__ == '__main__':
  66.  
  67. print 'loading images...'
  68.  
  69. imgL = cv2.pyrDown( cv2.imread('../gpu/aloeL.jpg') ) # downscale images for faster processing
  70.  
  71. imgR = cv2.pyrDown( cv2.imread('../gpu/aloeR.jpg') )
  72.  
  73.  
  74.  
  75. # disparity range is tuned for 'aloe' image pair
  76.  
  77. window_size = 3
  78.  
  79. min_disp = 16
  80.  
  81. num_disp = 112-min_disp
  82.  
  83. stereo = cv2.StereoSGBM(minDisparity = min_disp,
  84.  
  85. numDisparities = num_disp,
  86.  
  87. SADWindowSize = window_size,
  88.  
  89. uniquenessRatio = 10,
  90.  
  91. speckleWindowSize = 100,
  92.  
  93. speckleRange = 32,
  94.  
  95. disp12MaxDiff = 1,
  96.  
  97. P1 = 8*3*window_size**2,
  98.  
  99. P2 = 32*3*window_size**2,
  100.  
  101. fullDP = False
  102.  
  103. )
  104.  
  105.  
  106.  
  107. print 'computing disparity...'
  108.  
  109. disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
  110.  
  111.  
  112.  
  113. print 'generating 3d point cloud...',
  114.  
  115. h, w = imgL.shape[:2]
  116.  
  117. f = 0.8*w # guess for focal length
  118.  
  119. Q = np.float32([[1, 0, 0, -0.5*w],
  120.  
  121. [0,-1, 0, 0.5*h], # turn points 180 deg around x-axis,
  122.  
  123. [0, 0, 0, -f], # so that y-axis looks up
  124.  
  125. [0, 0, 1, 0]])
  126.  
  127. points = cv2.reprojectImageTo3D(disp, Q)
  128.  
  129. colors = cv2.cvtColor(imgL, cv2.COLOR_BGR2RGB)
  130.  
  131. mask = disp > disp.min()
  132.  
  133. out_points = points[mask]
  134.  
  135. out_colors = colors[mask]
  136.  
  137. out_fn = 'out.ply'
  138.  
  139. write_ply('out.ply', out_points, out_colors)
  140.  
  141. print '%s saved' % 'out.ply'
  142.  
  143.  
  144.  
  145. cv2.imshow('left', imgL)
  146.  
  147. cv2.imshow('disparity', (disp-min_disp)/num_disp)
  148.  
  149. cv2.waitKey()
  150.  
  151. cv2.destroyAllWindows()
  152.  
  153.  
Runtime error #stdin #stdout #stderr 0.02s 44632KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "<builtin>/app_main.py", line 75, in run_toplevel
  File "prog.py", line 17, in <module>
    import numpy as np
ImportError: No module named numpy