Ask Your Question
0

Plane Gray Disparity Map by StereoSGBM

asked 2018-04-13 05:12:50 -0600

mfischer-gundlach gravatar image

updated 2018-04-13 06:24:20 -0600

Hey there,

I am moving my code from python to C++ but run into troubles when computing a disparity map with StereoSGBM. The map has the same values everywhere -from my python version I do know its not that smooth at all.

Here is some code:

const std::string filename_1 = "i1.png";
const std::string filename_2 = "i2.png";
cv::Mat image_1_grayscale;
cv::cvtColor(cv::imread(filename_1), image_1_grayscale, cv::COLOR_BGR2GRAY);
cv::Mat image_2_grayscale;
cv::cvtColor(cv::imread(filename_2), image_2_grayscale, cv::COLOR_BGR2GRAY);

cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create();

cv::Mat disp;
sgbm->compute(image_1_grayscale, image_2_grayscale, disp);

if (!disp.empty()){
    cv::imshow("normal", disp);
    cv::waitKey();
    cv::destroyAllWindows();
   }

I checked size of disp after computation and it does change to the size of the images, is of type CV_16SC1 and every value is -16.

Whats wrong in this snippet?

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
0

answered 2018-04-13 05:17:49 -0600

berak gravatar image

updated 2018-04-13 05:19:42 -0600

Whats wrong in this snippet? -- the type. please check disp.type().

if it's CV_16S, use:

disp.at<short>(0, 0));

if it's CV_16U:

disp.at<ushort>(0, 0));

maybe just print out some small region:

cout  << disp(Rect(100,100,10,10)) << endl;
edit flag offensive delete link more

Comments

Hey, Thanks for the reply. I edited my question as it was not really clear what the problems was. The problem is not the value itself but the fact that every entry in the disparity map has the same value.

mfischer-gundlach gravatar imagemfischer-gundlach ( 2018-04-13 06:22:26 -0600 )edit

there are params to configure here , the default values probablydid not work in your case.

berak gravatar imageberak ( 2018-04-13 06:28:30 -0600 )edit
1

The values are fine (I know the expected results from my python scripts). The problem appears to be with imshow() for the disparity map. If I first save the map to an PNG and than use imshow() on the PNG everything is fine.

I will attach an image as answer to my question as soon as the 2 day rule does not apply anymore.

mfischer-gundlach gravatar imagemfischer-gundlach ( 2018-04-13 07:02:27 -0600 )edit

Disparity map is a 2D matrix of CV_16SC1 stereo disparity match values, as you said.

Non-negative values, ex. 0 or larger, are the disparity of the stereo match at that point, in units of 1/DISP_SCALE.

Negative values, ex. -16 = -DISP_SCALE, mean no disparity is available for that point - there was no match calculated at that point. Either the disparity is outside the search volume (horopter), filtered out as noise, or otherwise not found.

opalmirror gravatar imageopalmirror ( 2018-04-13 17:32:33 -0600 )edit

you probably want to convert the image to 8U before using imshow, also. See http://answers.opencv.org/question/22102

opalmirror gravatar imageopalmirror ( 2018-04-13 17:37:18 -0600 )edit
1

you probably want to convert the image to 8U before using imshow, also. See http://answers.opencv.org/question/22102

That's actually the solution the the problem I was looking for as a saved image was fine. Thanks.

mfischer-gundlach gravatar imagemfischer-gundlach ( 2018-04-16 01:34:14 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2018-04-13 05:12:50 -0600

Seen: 1,245 times

Last updated: Apr 13 '18