1.立体标定的目标
立体标定是计算空间上两台摄像机几何关系的过程,目的是计算双目视觉系统中两台摄像机之间的相对位置关系,即求取两台摄像机之间的旋转矩阵R和平移矩阵T。
2.立体成像
模仿人眼的立体成像能力,双目视觉可以将视差重投影成物体距离光心的距离。
图2.1 立体成像简单原理
xl和xr分别代表某个点在左图像的x左边和在右图像的x左边,假设左右图像上这两点是匹配好的特征对应点,d=xl - xr就是视差。这时利用相似三角形原理就可以求出Z值。
利用相似三角形原理得(T - (xl - xr)) / (Z - f)=T / Z 求得 Z=f * T / (xl - xr)。
3.对极几何
立体成像的基本几何学就是对极几何。从本质上来说,对极几何就是将两个针孔模型和一些新的被称为极点的感兴趣点结合起来。极面就是观测点P与两个投影中心Ol和Or确定的面,极点就是投影中心的连线与两个投影面的交点。如图所示。
图2.2 对极几何图示
根据对极几何的性质,知道给定图像上的一个特征,它在另一幅图像上的匹配视图一定在对应的极线上。这就是“对极约束”。“对极约束”意味着,一旦我们知道立体试验台的对极几何之后,两幅图像之间匹配特征的二维搜索就转变为沿着极线的一维搜索。这不仅仅节省了大量的计算时间,还允许我们排出许多导致虚假匹配的点。
3.立体校正
为了使立体匹配步骤更加容易并且更加精准,立体校正是必须的,基于对极几何立体校正将左右两幅图像调整为完全的行对准,当两幅图像是完全的行对准时,计算立体视差是最简单的。立体校正的目的是对两台摄像头的图像平面重投影,是的它们精准落在同一个平面上,而且图像的行也完全地对准到前向平行的结构上。
本征矩阵的意义就是将两个相机拍摄的同一点的两个相机坐标系下的坐标联系起来,而基础矩阵就是将同一点在两个像平面坐标系下的坐标联系起来。
关于本征矩阵和基础矩阵的东西,想知道详情的可以自行阅读《学习opencv》。
4.opencv代码示例
(部分代码,仅供参考)
bool StereoCalibration::getStereoResult(StereoResult* &sr)
{
Mat R,T,E,F,R1,R2,P1,P2,Q;
Rect validRoi[2];
if(objectPoints.size() == 0)
{
return false;
}
double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imgSize, R, T, E, F,
TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, DBL_EPSILON),
CV_CALIB_FIX_INTRINSIC);
stereoRectify(cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imgSize, R, T, R1, R2, P1, P2, Q,
0,0, imgSize, &validRoi[0], &validRoi[1]);
sr=new StereoResult(R,T,E,F,R1,R2,P1,P2,Q);
return true;
}