现在很多双目相机标定的原理说明。个人看过比较好的链接如下:
http://blog.csdn.net/chenyusiyuan/article/details/5961769
http://blog.csdn.net/chenyusiyuan/article/details/5963256
我学习时,找了许多代码资料,很多不完整,或代码不够简洁。以下代码是我参考别人的代码最终写出的双目相机标定代码。
创建一个双目相机标定类CCalibratnMethod。源文件和头文件内容如下
//.cpp
//双目标定函数 输入为CAMERACALIB& cameraCalib在头文件中定义
void CCalibratnMethod::CameraCalibration(CAMERACALIB& cameraCalib)
{
m_cameraCalib = cameraCalib;
cvutMatrix::Matrix<double> Rl(3,3); //左边图像的旋转矩阵
cvutMatrix::Matrix<double> Tl(3,1);//左边图像的平移矩阵
cvutMatrix::Matrix<double> Rr(3,3); //右边图像的旋转矩阵
cvutMatrix::Matrix<double> Tr(3,1);//右边图像的平移矩阵
cvutMatrix::Matrix<double> steroR(3,3);
cvutMatrix::Matrix<double> steroT(3,1);
cvutMatrix::Matrix<double> intrinsic_matrixL(3,3);
cvutMatrix::Matrix<double> distortion_coeffsL(4,1);
cvutMatrix::Matrix<double> intrinsic_matrixR(3,3);
cvutMatrix::Matrix<double> distortion_coeffsR(4,1);
ifstream fsImgL(cameraCalib.m_sFilePathL); //左摄像头定标所用图像文件的路径
ifstream fsImgR(cameraCalib.m_sFilePathR);
//左相机标定图像角点提取
CornerDetection(fsImgL,m_imagePointSeqL);
//右相机标定图像角点提取
CornerDetection(fsImgR,m_imagePointSeqR);
//左图角点转换
CvSize square_size = cvSize((int)m_cameraCalib.m_dSquareSize,(int)m_cameraCalib.m_dSquareSize);
cvutMatrix::Matrix<double> object_pointsL(bordSize.width*bordSize.height*sucesses,3);
cvutMatrix::Matrix<double> image_pointsL(m_imagePointSeqL.cvseq->total,2);
cvutMatrix::Matrix<int> point_countsL(sucesses,1);
CornerConvert(m_imagePointSeqL,object_pointsL,image_pointsL,point_countsL);
//右图角点转换
cvutMatrix::Matrix<double> object_pointsR(bordSize.width*bordSize.height*sucesses,3);
cvutMatrix::Matrix<double> image_pointsR(m_