2014-03-03 102 views
2

我試圖通過使用OpenCV來生成立體圖像的不一致性,並通過使用GPU來優化性能,但其結果是不同的。OpenCV StereoSGBM和gpu之間的巨大差異:: StereoBM_GPU

StereoSGBM初始化

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); 

結果: http://i.stack.imgur.com/eov4N.jpg

GPU :: StereoBM_GPU初始化

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); 

結果: http://i.stack.imgur.com/WVzrK.jpg

有誰知道w^HY?

回答

2

gpu::StereoBM_GPUcv::StereoBMdocumentation link)的GPU版本。

cv::StereoSGBM使用另一種算法(documentation link),因此得到不同的結果。

爲了確定爲什麼gpu::StereoBM_GPU的結果是錯誤的,知道如何糾正你的一對圖像將是有用的。

+0

感謝您的回答! – thanhit08

+0

這意味着在我使用'gpu :: StereoBM_GPU'之前,我必須糾正我的一對圖像,所以我可以得到與'cv :: StereoSGBM'相同的結果。那是你的意思? – thanhit08

+0

使用_any_立體匹配技術(包括'gpu :: StereoBM_GPU'和'cv :: StereoSGBM')之前,必須對輸入圖像對進行整形。然而,你似乎用'cv :: StereoSGBM'獲得了一個體面的結果,因此你的圖像必須已經被糾正。不過,可以用幾種方法完成圖像校正,'gpu :: StereoBM_GPU'需要某種形式的校正(其中差異在[[0,256]'範圍內),這可以解釋不好的結果。 – AldurDisciple