# What does a disparity map in OpenCV tell?

What does the map returned by `stereo.compute()` indicate?

The definition of disparity is the distance between two comparable pixels in the left and right images.
However, by running the following code, I obtained a map with the same size as the input photos with values ranging from `-16` to `211`. I got confused when it comes with some negative numbers. If these values refer to distance, why would a distance of `-16` be possible? (In fact, it has plenty of `-16` in the map).
What precisely do these values indicate?
Any help is greatly appreciated.

code:

``````import cv2 as cv
from matplotlib import pyplot as plt

print(imgL.shape)

stereo = cv.StereoBM_create(numDisparities=16, blockSize=17)
disparity = stereo.compute(imgL, imgR)

plt.imshow(disparity, "gray")
plt.show()
``````

### >Solution :

As per its documentation, `stereo.compute()` computes 16-bit fixed-point disparity map (where each disparity value has 4 fractional bits), whereas other algorithms output 32-bit floating-point disparity map.

In practice this means that the numbers your are having are integers that must be converted to floating point values.

With some little changes, I did:

``````import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

print(imgL.shape)

stereo = cv.StereoBM_create(numDisparities=16, blockSize=17)
disparity = stereo.compute(imgL, imgR).astype(np.float32)/16

print(f"Range: {np.min(disparity)} <-> {np.max(disparity)}")

plt.imshow(disparity, "gray")
plt.show()
``````

You can see that the disparity range is `-1.0 <-> 12.5625`, where -1 simply means that the matching algorithm couldn’t find a matching correspondence.

Instead, without the conversion `astype(np.float32)/16`, you would get a fake range of `-16 <-> 201`, which is wrong and also 201 is a too high value (you don’t have objects so close).

For a full example you may refer to my code here, as part of the SimpleStereo library.