我使用相机校准中的内在和外在文件来校正我的图像对,这样我就可以制作更好的深度图,但每次我尝试运行我的程序时。我的深度图输出只显示空白。
这是我整改的代码:
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
最佳答案
整改过程好像没问题,是不是你的数据有问题? 我建议确保您的整流输入没有错误地加载,并且重新映射步骤提供正确的行对齐立体声对。
关于c++ - 使用保存的参数进行立体相机校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55256780/