Ask Your Question
3

Big different between StereoSGBM and gpu::StereoBM_GPU

asked 2014-03-03 02:48:28 -0500

thanhit08 gravatar image

updated 2014-03-03 11:47:03 -0500

berak gravatar image

Hello there,

I try to generate disparity of stereo image by using OpenCV and optimize performance by using GPU but the results of them are different.

StereoSGBM initialize

StereoSGBM sbm;
sbm.SADWindowSize = 3;
sbm.numberOfDisparities = 144;
sbm.preFilterCap = 63;
sbm.minDisparity = -39;
sbm.uniquenessRatio = 10;
sbm.speckleWindowSize = 100;
sbm.speckleRange = 32;
sbm.disp12MaxDiff = 1;
sbm.fullDP = false;
sbm.P1 = 216;
sbm.P2 = 864;
sbm(grayLeftCurrentFrameCPU, grayRightCurrentFrameCPU, resultCurrentFrameCPU);
normalize(resultCurrentFrameCPU, resultNorCurrentFrameCPU, 0, 255, CV_MINMAX, CV_8U);

gpu::StereoBM_GPU initialize

gpu::StereoBM_GPU *bm = new gpu::StereoBM_GPU();
bm->preset = gpu::StereoBM_GPU::BASIC_PRESET;
bm->ndisp = 48;
bm->winSize = 5;
bm->operator()(grayLeftCurrentFrameGPU, grayRightCurrentFrameGPU, resultCurrentFrameGPU);
gpu::normalize(resultCurrentFrameGPU, resultNorCurrentFrameGPU, 0, 255, CV_MINMAX, CV_8U);

Anyone know why? Thanks!

(StereoSBM)

StereoSGBM

(gpu::StereoBM_GPU) gpu::StereoBM_GPU

edit retag flag offensive close merge delete

3 answers

Sort by ยป oldest newest most voted
5

answered 2014-03-04 01:51:05 -0500

jensenb gravatar image

The difference in results between the CPU StereoSGBM and the GPU StereoBM_GPU methods does not surprise me. You are mixing up two very different stereo reconstruction approaches. The StereoGM_GPU is (more or the less) equivalent to the StereoBM CPU function, both perform winner takes it all (WTA) stereo matching using sum of absolute differences (SAD) between corresponding left and right image pixel values, such that the disparity with the least cost for each pixel individually is chosen. #

StereoSGBM on the other is a so called semi global method, so that in addition to calculating the least cost (local optimal) disparity value for each pixel individually, it enforces smoothness constraints between neighboring pixels so that they take similar disparity values. In practice such global methods tend to lead to better results, which you have just experienced.

edit flag offensive delete link more
0

answered 2016-09-12 15:43:56 -0500

vishwanathkr gravatar image

A good comparison would be the disparity maps for StereoBM vs CUDA StereoBM. These are the results that I got for the same parameters on these two implementations.

{bm_minDisparity: 0, numDisparities: 32, bm_SADWindowSize: 19, bm_disp12MaxDiff: 48, bm_preFilterCap: 25, bm_textureThreshold: 5, bm_preFilterSize: 5, bm_uniquenessRatio: 5, bm_speckleWindowSize: 25, bm_speckleRange: 10}

It turns out that the disparity maps that they return are of different types CV_16S vs CV_8U respectively. So I'm guessing there is some bit arithmetic wreaking havoc here. Normal StereoBM

CUDA StereoBM

edit flag offensive delete link more
-1

answered 2015-04-29 05:12:44 -0500

This is my stereo match result of BM algorithm between CPU and GPU. Does anyone know why there's hollow inside the object?

image description

CPU

image description

GPU

edit flag offensive delete link more

Comments

This are my prameters,

stereoParamBM:
    pre_filter_size: 63
    pre_filter_cap: 11
    SAD_window_size: 39
    min_disp: 0
    num_of_disp: 80
    texture_thresh: 16
    uniquenese_ratio: 5
    speckle_window_size: 41
    speckle_range: 11
escrowdis gravatar imageescrowdis ( 2015-04-29 05:13:43 -0500 )edit
Login/Signup to Answer

Question Tools

5 followers

Stats

Asked: 2014-03-03 02:48:28 -0500

Seen: 3,010 times

Last updated: Sep 12 '16