使用CUDA StereoBM的视差图看起来很暗

时间:2018-01-30 06:09:34

标签: image opencv

我正在使用 cv :: cuda :: stereoBM 创建视差地图。与CPU版本共处,地图看起来更暗,我不确定它是否有意义。如我得到的以下结果所示, CUDA 视差图中的左边人几乎丢失了,我无法进行进一步的距离计算。

目前,我发现使用 CUDA的视差图的数据类型是CV_8U ,而CPU版本是 CV_16S (使用imshow时需要转换)。我没有调整数据类型的参数,不知道它们为什么不同。我想这可能是关键原因,但不知道如何改进地图。

以下是我遵循的示例(使用CPU tho):基本上只创建左视差图,右视差图,然后使用它们并进行后置过滤。 (我使用 CUDA 获得了不同的结果,不仅是最终的过滤结果,还有正确的地图)。

https://docs.opencv.org/3.1.0/d3/d14/tutorial_ximgproc_disparity_filtering.html

我使用CPU的结果 enter image description here

我使用GPU的结果 enter image description here

    Ptr<cuda::StereoBM> left_matcher = cuda::createStereoBM(96, 15);
    left_matcher->compute(GPUrgb1, GPUrgb2, d_left_disp);

    int min_disp = left_matcher->getMinDisparity();
    int num_disp = left_matcher->getNumDisparities();
    int wsize = left_matcher->getBlockSize();
    Ptr<cuda::StereoBM> right_matcher = cuda::createStereoBM(num_disp, wsize);
    Ptr<DisparityWLSFilter> wls_filter;
    wls_filter = createDisparityWLSFilter(left_matcher);
    right_matcher->setMinDisparity(-(min_disp + num_disp) + 1);
    right_matcher->setTextureThreshold(0);
    right_matcher->setUniquenessRatio(0);
    right_matcher->setDisp12MaxDiff(1000000);
    right_matcher->setSpeckleWindowSize(0);
    right_matcher->compute(GPUrgb2, GPUrgb1, d_right_disp);


    Mat filtered_disp_vis;
    d_left_disp.download(left_disp);
    d_right_disp.download(right_disp);



    double lambda = 5000;
    double sigma = 1.5;
    wls_filter->setLambda(lambda);
    wls_filter->setSigmaColor(sigma);
    wls_filter->filter(left_disp, rgb1, filtered_disp, right_disp);

    imshow("filtered disparity", filtered_disp);

还有一个问题,对于使用reprojectImageTo3D进行距离计算,我应该将16除以因为我的视差图是在CV_8U中吗?

如果有人可以提供帮助,请提前致谢!

0 个答案:

没有答案