c++ - 为什么 StereoSGBM 给出负数和上面的 numberOfDisparities 数

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

我正在 OpenCV 中编写一个函数来计算 v 和 u 视差,因此我首先需要视差图像。我设置 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    
}

最佳答案

在我看来,差异是一个 float ,它反射(reflect)在参数上。如果将结果转换为 float ,然后除以 16,事情就更有意义了:

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

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

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

关于c++ - 为什么 StereoSGBM 给出负数和上面的 numberOfDisparities 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33308326/

相关文章:

C++从文件的一部分加载数据

c++ - 是否可以使生成的 doxygen 输出看起来像 msdn 样式文档(可能是 sandcaSTLe 生成的)?

c++ - "Tracking"与 Thrift 的连接

python - 使用 Python OpenCV 读取颜色索引的 .tiff 文件

c++ - OpenCV StereoRectify未校准到 3D 点云

带有网络摄像头输入和立体输出的 ffmpeg

C++ 重构预编译头文件

c++ - OpenCV - 错误 C2244

c++ - 'MSize' 不是 cv::Mat 的成员

c++ - OpenCV实时立体摄像头图像处理问题(后标定)