//读取
Mat cameraMatrix[2], distCoeffs[2];
Mat R, T, E, F;
// save intrinsic parameters
FileStorage fs("intrinsics.yml", FileStorage::READ);
if (fs.isOpened())
{
fs["M1"] >> cameraMatrix[0];
fs["D1"] >> distCoeffs[0];
fs["M2"] >> cameraMatrix[1];
fs["D2"] >> distCoeffs[1];
fs.release();
}
else
{
cout << "Error: can not save the intrinsic parameters\n";
}
Mat R1, R2, P1, P2, Q;
//Rect validRoi[2];
fs.open("extrinsics.yml", FileStorage::READ);
if (fs.isOpened())
{
// R - 相机之间的旋转矩阵,这里R的意义是:相机1通过变换R到达相机2的位姿
// T - 左相机到右相机的平移矩阵
// R1 - 输出矩阵,第一个摄像机的校正变换矩阵(旋转变换)
// R2 - 输出矩阵,第二个摄像机的校正变换矩阵(旋转矩阵)
// P1 - 输出矩阵,第一个摄像机在新坐标系下的投影矩阵
// P2 - 输出矩阵,第二个摄像机在想坐标系下的投影矩阵
// Q - 4 * 4的深度差异映射矩阵
fs["R"] >> R;
fs["T"] >> T;
fs["R1"] >> R1;
fs["R2"] >> R2;
fs["P1"] >> P1;
fs["P2"] >> P2;
fs["Q"] >> Q;
fs.release();
}
else
{
cout << "Error: can not save the extrinsic parameters\n";
}
Size imageSize(camera_width, camera_width);
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix[1], distCoeffs[1], R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]);
//使用
if (calibration)
remap(dst, dst, rmap[0][0], rmap[0][1], INTER_LINEAR);//左图纠正
if (calibration)
remap(dst, dst, rmap[1][0], rmap[1][1], INTER_LINEAR);//右图纠正