为什么StereoSGBM会给出负数以及数量以上的数字

时间:2015-10-23 17:36:16

标签: c++ opencv stereo-3d disparity-mapping

我正在OpenCV中编写一个函数来计算v和u-disparities,所以我首先需要视差图像。我设置sgbm.minDisparity = 0和numberOfDisparities = 160.

视差图像是CV_16SC1,我需要无符号值来继续编程我的函数。

我打印了整个Mat,并且有负值和值超过160.如果我很好地理解文档,则视差图像表示差异值* 16。这是否意味着在我的情况下最大值是16 * 160?如果不是,那可能是什么问题?无论如何,当minDisparity设置为0时,为什么有小于零的值?这是代码:

void Stereo_SGBM(){
    int numberOfDisparities;
    StereoSGBM sgbm;
    Mat img1, img2;

    img1=left_frame;   //left and right frames are global variables
    img2=right_frame;

    Size img_size = img1.size();

    //I make sure the number of disparities is divisible by 16
    numberOfDisparities = 160;  

    int cn=1;   //Grayscale

    sgbm.preFilterCap = 63;
    sgbm.SADWindowSize = 3;
    sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
    sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
    sgbm.minDisparity = 0;
    sgbm.numberOfDisparities = numberOfDisparities;
    sgbm.uniquenessRatio = 10;
    sgbm.speckleWindowSize = 100;
    sgbm.speckleRange = 2;
    sgbm.disp12MaxDiff = 1;
    sgbm.fullDP = false;  

    Mat disp;   // CV_16SC1
    Mat disp8;  //CV_8UC1 (used later in the code


    sgbm(img1, img2, disp); 
    //disp contains negative values and larger than 160!!!

    //img1 and img2 are left and right channels of size 1242x375 grayscale    
}

1 个答案:

答案 0 :(得分:1)

我看到它的方式,差异意味着浮动,它反映了参数。如果将结果转换为float,除以16,事情会更有意义:

该算法显然报告-1(实际上是minDisparity - 1),它无法匹配。而numberOfDisparities更多是“最大差异 - 最小差异”,而不是实际的数值。

例如,如果你给minDisparity = 2和numberOfDisparities = 144,你将获得范围内的结果:1.0 - 145.0。不同值的数量实际上是144 * 16,因为它以1/16为增量。

所以是的,在你的情况下,使用整数,这意味着你将获得16 * 160的最大值。