首页 文章

立体声差异图生成

提问于
浏览
5

我正在研究KITTI数据集我正在拍摄2张图像并找到差异以获得3D点 Cloud . 我面临的问题是我无法获得良好的视差图 . 大部分差异值小于0.1 . 差异值在0到1之间(我需要缩放它们) . 我的立体声参数如下所示

cv::StereoBM sbm;
    sbm.state->SADWindowSize = 9;
    sbm.state->numberOfDisparities = 112;
    sbm.state->preFilterSize = 5;
    sbm.state->preFilterCap = 1;
    sbm.state->minDisparity = 0;
    sbm.state->textureThreshold = 5;
    sbm.state->uniquenessRatio = 5;
    sbm.state->speckleWindowSize = 0;
    sbm.state->speckleRange = 20;
    sbm.state->disp12MaxDiff = 64;
sbm(leftimage, rightimage,disp);
    normalize(disp, disp8, 0.1, 255, CV_MINMAX, CV_8U);

right image

left image

Disparity map

1 回答

  • 11

    您对“块匹配”看起来很“好看”的视差图 .

    块匹配是获取视差图的最基本方法 . 它是一种本地方法,通过强力搜索(来自opencv的模滤波)计算视差估计 . 因此,其输出在精度上受到限制并且通常是有噪声的 .

    正如其他人所提到的,您可以调整窗口大小以稍微改善结果,但这不会使差异明显更好 .

    查看KITTI benchmark上的立体声评估,并根据需要选择更准确的算法 . OpenCV实现了SGM,可以产生更平滑的差异 . 所需的视差图质量取决于您的应用 . 在某些情况下,块匹配就足够了 . 对于其他人,可能不是 .

    请记住,视差的定义是:左图像中像素的x坐标与右图像中相应像素的x坐标之间的差异 . 也就是说,视差单位是“像素” .

    较大的差异,意味着更近的物体 . 缩放图像以进行显示时,较大的差异会显得更亮 . 例如,道路上的标志离摄像机更近,它看起来比远离道路的像素更亮 .

    您的视差值不应该介于0和1之间 . 您正在缩放图像以显示为uint8,可以显示,但不适合将差异用于实际测量 .

    在OpenCV中,默认行为是将视差图生成为通过将子像素移位乘以16获得的有符号短路 . 要获得真实的视差值,将opencv的输出除以16并转换为float .

    你可以这样做:

    cv::Mat<float> true_dmap = disp * (1.0 / 16.0f);
    

    要么

    disp.convertTo(true_dmap, CV_32F, 1.0/16.0, 0.0);
    

    或者,您可以调用reprojectImageTo3D以获得估计的视差图和立体校准的点 Cloud .

    请注意,如果您尝试通过imshow显示true_map,则不会看到有意义的内容 .

    祝好运,

相关问题