在做相机方面的工作,需要进行内参标定,之前一直是在用matlab中camera_calibrate做的,需要拍摄多张标定板图片另外还需要安装matlab软件,工程操作有误可能带来后续计算位姿误差,因此在做内参标定优化,发现内参标定原理一直理解不够深,就去找了下opencv中cameraCalibrate函数的源码来看下,做个记录
函数定义在opencv\opencv-master\opencv-master\modules\calib3d\src\calibration.cpp中,从cv::calibrateCamera函数进入,几层封装,找到cv::calibrateCameraRO函数开始看解算实现
下面会跳过一些变量定义和检查,主要看实现过程,这里找到计算的函数接口cvCalibrateCamera2Internal
开始解算
1. initialize intrinsic parameters & LM solver 初始化参数和LM求解器
cvInitIntrinsicParams2D解算内参矩阵作为优化初值
求内参时先用cvFindHomography获取单应性矩阵,再用cvSolve进行线性求解(参考张正友内参标定推导[图像]张正友论文翻译(2)_祥的专栏-CSDN博客_张正友论文)
2. initialize extrinsic parameters 获取外参初始值 RT
3. run the optimization 用LM进行求解 这里暂时没看到雅可比矩阵在哪求解的(待续)
LM接口及变量介绍参见LM 优化算法 opencv中的实现_xuelangwin的博客-CSDN博客
这里相机模型的jaccobi矩阵推导参考相机标定过程中,根据得到的标定参数进行重投影计算的推导过程(推导公式对后续LM算法中计算Jacobian矩阵有重要作用)_肉夹馍不放香菜的博客-CSDN博客