Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import cv2 as cv
from matplotlib import pyplot as plt

imgL = cv.imread("data/stereo-corridor_l.png", 0)
print(imgL.shape)
imgR = cv.imread("data/stereo-corridor_r.png", 0)

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

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

two images used:
stereo right
image R
stereo left
image L

>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

imgL = cv.imread("data/stereo-corridor_l.png", 0)
print(imgL.shape)
imgR = cv.imread("data/stereo-corridor_r.png", 0)

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.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading