为什么StereoSGBM给出负数和高于numberof差异性的数字?

Why does StereoSGBM give negative and above numberOfDisparities numbers

本文关键字:差异性 numberof 数字 高于 StereoSGBM 为什么      更新时间:2023-10-16

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

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

我打印了整个Mat,有负值和高于160的值。如果我很好地理解了文档,那么视差图像表示视差值*16。在我的例子中,这是否意味着最大值是16*160 ?如果不是,又会出什么问题呢?不管怎样,为什么minDisparity被设为0时值小于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    
}

在我看来,差距应该是一个浮点数,它反映在参数上。如果将结果转换为浮点数,并除以16,事情就更有意义了:

算法显然报告-1(实际上是minDisparity -1),它不能匹配。而numberofdisparity更像是"最大差距-最小差距",而不是实际的数值。

例如,如果给定minDisparity=2, numberofdisparity =144,则得到的结果范围为:1.0 - 145.0。不同值的数量实际上是144*16,因为它以1/16为单位递增。

是的,在你的例子中,使用整数,这意味着你将得到16*160的最大值