【问题标题】:OpenCV Big difference between StereoSGBM and gpu::StereoBM_GPUOpenCV StereoSGBM 和 gpu::StereoBM_GPU 之间的巨大区别
【发布时间】:2014-03-03 09:08:23
【问题描述】:

我尝试使用 OpenCV 生成立体图像的视差并使用 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

有人知道为什么吗?

【问题讨论】:

    标签: opencv image-processing gpu stereoscopy disparity-mapping


    【解决方案1】:

    gpu::StereoBM_GPUcv::StereoBM (documentation link) 的 GPU 版本。

    cv::StereoSGBM 使用另一种算法 (documentation link),因此结果不同。

    为了确定为什么gpu::StereoBM_GPU 的结果是错误的,了解您是如何纠正这对图像的会很有用。

    【讨论】:

    • 这意味着在我使用 gpu::StereoBM_GPU 之前,我必须纠正我的这对图像,这样我才能得到与 `cv::StereoSGBM' 相同的结果。这就是你的意思?
    • 在使用 any 立体匹配技术(包括gpu::StereoBM_GPUcv::StereoSGBM)之前,需要对输入图像进行校正。但是,您似乎使用cv::StereoSGBM 获得了不错的结果,因此您的图像必须已经被纠正。尽管如此,图像校正可以通过多种方式完成,gpu::StereoBM_GPU 需要某种形式的校正(视差在[0,256] 范围内),这可以解释结果不佳的原因。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多