opencv中cvCalibrateCamera2()的函数细解

来源:互联网 发布:西安硅峰网络薪资 编辑:程序博客网 时间:2024/05/17 16:42

  在标定摄像机的过程中,我们通常是要计算出摄像机的内参数矩阵和畸变系数,以便后来对图像进行校正和重构出图像的三维场景。

     在opencv中提供了一个cvCalibrateCamera2()函数,使用该函数,我们可以一次性得到摄像机内参数矩阵,畸变系数,旋转向量和平移矩阵。

    在这个函数中,计算内参数矩阵的原理其实是用了张正友的标定算法(如果想了解算法的详细情况,请参考他的《A Flexible New Technique for Camera Calibration》论文)在这里我只做简单的原理介绍。

   在前文中我曾经推导过单应性矩阵H=sM[r1 r2 r3 t],注意,我们此时的z平面为0,所以旋转向量第三个没有用,所以H=sM[r1 r2 t],我们设H=[h1 h2 h3],则可列出三个等式,h1=sMr1,h2=sMr2,h3=sMt,而我们在构造旋的旋转向量是相互正交的,即我们可以得到两个性质:一r1的转置矩阵乘以r2是等于0,二旋转向量的单位长度也相等,||r1||=||r2||,那么由此我们可以导出两个约束:

1
2
,利用这两个约束,我们同时得到k个棋盘图像,堆叠方程,便可解出内参数矩阵。

void cvCalibrateCamera2(
//输入参数
const CvMat* object_points, //世界坐标点
const CvMat* image_points,//图像坐标点
const CvMat* point_counts, //每张图像的中的角点数
CvSize image_size,//输出参数
CvMat* intrinsic_matrix,   //内参数矩阵
CvMat* distortion_coeffs,//畸变系数
CvMat* rotation_vectors=NULL,//旋转向量
CvMat* translation_vectors=NULL,//平移向量
//标志位
/*CV_CALIB_USE_INTRINSIC_GUESS -内参数矩阵包含fx,fy,cx和cy的初始值。否则,(cx, cy)被初始化到图像中心(这儿用到图像大小),焦距用最小平方差方式计算得到。注意,如果内部参数已知,没有必要使用这个函数,使用cvFindExtrinsicCameraParams2则可。
CV_CALIB_FIX_PRINCIPAL_POINT - 主点在全局优化过程中不变,一直在中心位置或者在其他指定的位置(当CV_CALIB_USE_INTRINSIC_GUESS设置的时候)。
CV_CALIB_FIX_ASPECT_RATIO - 优化过程中认为fx和fy中只有一个独立变量,保持比例fx/fy不变,fx/fy的值跟内参数矩阵初始化时的值一样。在这种情况下, (fx, fy)的///实际初始值或者从输入内存矩阵中读取(当CV_CALIB_USE_INTRINSIC_GUESS被指定时),或者采用估计值(后者情况中fx和fy可能被设置为任意值,只有比值被使用)。
CV_CALIB_ZERO_TANGENT_DIST – 切向形变参数(p1, p2)被设置为0,其值在优化过程中保持为0。*/
int flags=0
);

原创粉丝点击