pythonopencvstereoscopy

ReprojectImageTo3D corresponding pixel in image (Stereo Vision)


I have a disparity map.

Based on the disparity map, hovering on the 'left image' displays:

X and y of the image, So if i hover on the top-left most, it will display x:0, y:0

The next step is to display distance of the specific pixel,to make my life easy, I will try to do it with reprojectImageTo3D(disp, Q)

I got Q from stereoRectify

now, reprojectImageTo3D in python, returns an n by 3 matrix.

So I can see, it is a row of x y z coordinates. Wondering, how can I know which pixel are these coordinates correspond to?

This is a sample of the 3D points that I saved using numpy.savetxt

http://pastebin.com/wwDCYwjA

BTW: I'm doing everything in python, but GUI in Java, I don't have time to study GUI in python.


Solution

  • If you correctly calculate your disparity map, you should get (n1,n2,1) dimensional array, where n1,n2 - number of image's pixels by axes, 1 - number of chanels (single channel, which contain distance in pixels between correspondent pixels from left and right images). You should check that by typing disp.shape. After that you should pass your disparity map's ndarray to reprojectImageTo3D function and get ndarray, which has (n1,n2,3) shape (third dimension contains X,Y,Z coords of 3D point). You can check that by typing:

    threeDImage = reprojectImageTo3D(disp, Q)
    print threeDImage.shape
    

    And finally, since you made your disparity map based on left image, each pixel, which has coords x,y on left image (or disparity map), corresponds to threeDImage[x][y] 3D point. Keep in mind, that row:0, column:0 is the top-left element of the matrix, based on opencv handling images:

    0/0---column--->
     |
     |
    row
     |
     |
     v