使用保存的参数进行立体摄像机矫正

时间:2019-03-20 08:53:15

标签: c++ opencv

我使用我的相机校准中的内在和外在文件纠正我的图像对,这样我可以制作出更好的深度图,但是每次我尝试运行程序时。我的深度图输出仅显示为空白。

这是我的纠正代码:

    FileStorage fs("intrinsics.yml", FileStorage::READ);
    fs["intrisics"] >> intrinsics;

    Mat M1, D1, M2, D2;
    fs["M1"] >> M1;
    fs["D1"] >> D1;
    fs["M2"] >> M2;
    fs["D2"] >> D2;

    M1 *= scale;
    M2 *= scale;

    fs.open("extrinsics.yml", FileStorage::READ);
    fs["extrinsics"] >> extrinsics;

    Mat R, T, R1, R2, P1, P2;
    fs["R"] >> R;
    fs["T"] >> T;
    fs["R1"] >> R1;
    fs["R2"] >> R2;
    fs["P1"] >> P1;
    fs["P2"] >> P2;
    fs["Q"] >> Q;
    stereoRectify(M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, 0, -1, img_size, &roi1, &roi2);

    Mat map11, map12, map21, map22;
    initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_32FC1, map11, map12);
    initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_32FC1, map21, map22);

    Mat img1r, img2r;
    remap(grayL, img1r, map11, map12, INTER_LINEAR);
    remap(grayR, img2r, map21, map22, INTER_LINEAR);

我的SGBM代码:

    Ptr<StereoSGBM> sgbm = StereoSGBM::create
    (0,    //int minDisparity
        96,     //int numDisparities
        5,      //int SADWindowSize
        600,    //int P1 = 0
        2400,   //int P2 = 0
        20,     //int disp12MaxDiff = 0
        16,     //int preFilterCap = 0
        1,      //int uniquenessRatio = 0
        100,    //int speckleWindowSize = 0
        20,     //int speckleRange = 0
        true);  //bool fullDP = false

    sgbm->compute(img1r, img2r, disparity_sgbm);

    normalize(disparity_sgbm, disp_done_sgbm, 0, 255, CV_MINMAX, CV_8U);

每次我校准摄像机并运行程序时,它都会给出不错的深度图。但立体声对未对准,因为它没有整流。校准相机需要花费几个小时,所以我只是尝试加载相机的参数,因此我不必每次都校准几个小时就可以获得一个不错的深度图

提前谢谢!

这是我的输出:

https://docs.google.com/document/d/1ajS3vgoVPx2RgbroV8qH2WYHU85PL_SJ-9A4q8aa8e8/edit?usp=sharing

1 个答案:

答案 0 :(得分:0)

纠正过程似乎还可以,您的数据是否可能有问题? 我建议确保您的整流输入没有错误加载,并且重新映射步骤会给出正确的行对齐立体声对。