双目相机的remap主要是为了解决“极线对齐”的问题,需要输入相机的内外参数,分别产生左图x方向、y方向和右图x方向、y方向的remap表格,并由这个表格按照LUT对原图像进行“极限校正”。
对极几何是双目相机立体标定的数学基础,相关知识点参考:http://blog.csdn.net/dcrmg/article/details/52986522
主要思路是:
(1)读入双目相机的内外参数:
- FileStorage fs(path, FileStorage::READ);
- vector<string> Limg_list, Rimg_list;
- if (!fs.isOpened())
- {
- cout << "open camaredata file error!" << endl;
- return false;
- }
- fs["M1"] >> M1; //> Limg的内参
- fs["D1"] >> D1; //> Limg的畸变系数
- fs["M2"] >> M2; //> Rimg的内参
- fs["D2"] >> D2; //> Rimg的畸变系数
- fs["R"] >> R; //> 旋转矩阵
- fs["T"] >> T; //> 平移矩阵
M1-左目相机内参;
D1-左目相机畸变系数;
M2-右目相机内参;
D2-右目相机畸变系数;
R -双目相机外参的旋转矩阵;
T -双目相机外参的平移矩阵;
(2)利用stereoRectify函数,由双目相机内外参数计算双目相机的校正变换矩阵;
(3)利用initUndistortRectifyMap函数,由对应的相机内参和校正变换矩阵计算x和y方向的remap表格;
- Mat Rl, Rr, Pl, Pr, Q;
- stereoRectify(M1, D1, M2, D2, Size(1280, 720), R, T, Rl, Rr, Pl, Pr, Q, CALIB_ZERO_DISPARITY, -1, Size(1280, 720));
- initUndistortRectifyMap(M1, D1, Rl, Pl, Size(1280, 720), CV_32FC1, mapLx, mapLy);
- initUndistortRectifyMap(M2, D2, Rr, Pr, Size(1280, 720), CV_32FC1, mapRx, mapRy);
(4)利用remap函数,由remap表格和对应的原图计算极线校正之后的图像。
- Mat Limg = imread("Limage.png", CV_LOAD_IMAGE_ANYDEPTH);
- Mat Rimg = imread("Rimage.png", CV_LOAD_IMAGE_ANYDEPTH);
- Mat re_imgL, re_imgR;
- remap(Limg, re_imgL, mapLx, mapLy, INTER_LINEAR);
- remap(Rimg, re_imgR, mapRx, mapRy, INTER_LINEAR);