Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate distance (disparity) OpenCV

-- Update 2 --

The following article is really useful (although it is using Python instead of C++) if you are using a single camera to calculate the distance: Find distance from camera to object/marker using Python and OpenCV

Best link is Stereo Webcam Depth Detection. The implementation of this open source project is really clear.

Below is the original question.


For my project I am using two camera's (stereo vision) to track objects and to calculate the distance. I calibrated them with the sample code of OpenCV and generated a disparity map.

I already implemented a method to track objects based on color (this generates a threshold image).

My question: How can I calculate the distance to the tracked colored objects using the disparity map/ matrix?

Below you can find a code snippet that gets the x,y and z coordinates of each pixel. The question: Is Point.z in cm, pixels, mm?

Can I get the distance to the tracked object with this code?

Thank you in advance!

cvReprojectImageTo3D(disparity, Image3D, _Q);

vector<CvPoint3D32f> PointArray;
CvPoint3D32f Point;

for (int y = 0; y < Image3D->rows; y++) {    

    float *data = (float *)(Image3D->data.ptr + y * Image3D->step);  

    for (int x = 0; x < Image3D->cols * 3; x = x + 3) 
    {   
        Point.x = data[x];        
        Point.y =  data[x+1];     
        Point.z = data[x+2];
        PointArray.push_back(Point);
        //Depth > 10
        if(Point.z > 10)
        {
            printf("%f %f %f", Point.x, Point.y, Point.z);              
        }
    }
}
cvReleaseMat(&Image3D);

--Update 1--

For example I generated this thresholded image (of the left camera). I almost have the same of the right camera.

enter image description here

Besides the above threshold image, the application generates a disparity map. How can I get the Z-coordinates of the pixels of the hand in the disparity map?

I actually want to get all the Z-coordinates of the pixels of the hand to calculate the average Z-value (distance) (using the disparity map).

like image 608
Odrai Avatar asked Jun 13 '13 20:06

Odrai


People also ask

How do you calculate distance from a disparity map?

Given a pair of stereo images, to compute the disparity map, we first match every pixel in the left image with its corresponding pixel in the right image. Then we compute the distance for each pair of matching pixels. Finally, the disparity map is obtained by representing such distance values as an intensity image.

How does Opencv calculate distance?

Steps for Distance Estimation: Capture Reference Image: Measure the distance from the object(face) to the camera, capture a Reference image and note down the measured distance. Measure the object (face) width, make sure that measurement units are kept for reference image and object(face) width. Mine Reference Image.

How does Python calculate depth from disparity map?

Depth is inversely proportional to disparity, i.e., from the depth estimation equation, we have Z∝1/(xl−xr). As disparity (xl−xr) increases, Z decreases and for lower disparity (xl−xr), we would have higher Z.


2 Answers

The math for converting disparity (in pixels or image width percentage) to actual distance is pretty well documented (and not very difficult) but I'll document it here as well.

Below is an example given a disparity image (in pixels) and an input image width of 2K (2048 pixels across) image:

Convergence Distance is determined by the rotation between camera lenses. In this example it will be 5 meters. Convergence distance of 5 (meters) means that the disparity of objects 5 meters away is 0.

CD = 5 (meters)        

Inverse of convergence distance is: 1 / CD

IZ = 1/5 = 0.2M

Size of camera's sensor in meters

SS  = 0.035 (meters)    //35mm camera sensor

The width of a pixel on the sensor in meters

PW = SS/image resolution = 0.035 / 2048(image width) = 0.00001708984

The focal length of your cameras in meters

FL = 0.07 //70mm lens

InterAxial distance: The distance from the center of left lens to the center of right lens

IA = 0.0025 //2.5mm

The combination of the physical parameters of your camera rig

A = FL * IA / PW

Camera Adjusted disparity: (For left view only, right view would use positive [disparity value])

AD = 2 * (-[disparity value] / A) 

From here you can compute actual distance using the following equation:

realDistance = 1 / (IZ – AD)

This equation only works for "toe-in" camera systems, parallel camera rigs will use a slightly different equation to avoid infinity values, but I'll leave it at this for now. If you need the parallel stuff just let me know.

like image 42
BHawk Avatar answered Oct 06 '22 04:10

BHawk


See this links: OpenCV: How-to calculate distance between camera and object using image?, Finding distance from camera to object of known size, http://answers.opencv.org/question/5188/measure-distance-from-detected-object-using-opencv/
If it won't solve you problem, write more details - why it isn't working, etc.

like image 124
cyriel Avatar answered Oct 06 '22 05:10

cyriel