用于标定立体相机
函数形式
C++:
cvStereoCalibrate( const CvMat* object_points, const CvMat* image_points1,
const CvMat* image_points2, const CvMat* npoints,
CvMat* camera_matrix1, CvMat* dist_coeffs1,
CvMat* camera_matrix2, CvMat* dist_coeffs2,
CvSize image_size, CvMat* R, CvMat* T,
CvMat* E CV_DEFAULT(0), CvMat* F CV_DEFAULT(0),
CvTermCriteria term_crit CV_DEFAULT(cvTermCriteria(
CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,1e-6)),
int flags CV_DEFAULT(CV_CALIB_FIX_INTRINSIC));
参数
o objectPoints– 校正的图像点向量组.
o imagePoints1–通过第一台相机观测到的图像上面的向量组.
o imagePoints2–通过第二台相机观测到的图像上面的向量组.
npoints--角点数
o cameraMatrix1– 输入或者输出第一个相机的内参数矩阵
o distCoeffs1– 输入/输出第一个相机的畸变系数向量
o cameraMatrix2– 输入或者输出第二个相机的内参数矩阵
o distCoeffs2– 输入/输出第二个相机的畸变系数向量
o imageSize– 图像文件的大小——只用于初始化相机内参数矩阵。
o R– 输出第一和第二相机坐标系之间的旋转矩阵。
o T– 输出第一和第二相机坐标系之间的旋转矩阵平移向量
o E–输出本征矩阵。
o F–输出基础矩阵。
o term_crit– 迭代优化算法终止的标准。
o flags–
不同的FLAG,可能是零或以下值的结合:
§ CV_CALIB_FIX_INTRINSIC要确认cameraMatrix? and distCoeffs?所以只有R, T, E , 和F矩阵被估计出来
§ CV_CALIB_USE_INTRINSIC_GUESS根据指定的FLAG优化一些或全部的内在参数。初始值是由用户提供。
§ CV_CALIB_FIX_PRINCIPAL_POINT在优化过程中确定主点。
§ CV_CALIB_FIX_FOCAL_LENGTH确定和 .
§ CV_CALIB_FIX_ASPECT_RATIO优化 . 确定的比值.
§ CV_CALIB_SAME_FOCAL_LENGTH执行以及 .
§ CV_CALIB_ZERO_TANGENT_DIST设置每个相机切向畸变系数为零并且设为固定值。
§ CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6在优化中不改变相应的径向畸变系数. 如果设置CV_CALIB_USE_INTRINSIC_GUESS , 使用distCoeffs矩阵提供的系数。否则将其置零.
§ CV_CALIB_RATIONAL_MODEL能够输出系数k4,k5,k6。提供向后兼容性,这额外FLAG应该明确指定校正函数使用理性模型和返回8个系数。如果FLAG没有被设置,该函数计算并只返回5畸变系数。
说明:
该函数计算了两个摄像头进行立体像对之间的转换关系。如果你有一个立体相机的相对位置,并且两个摄像头的方向是固定的,以及你计算了物体相对于第一照相机和第二照相机的姿态,(R1,T1)和(R2,T2),各自(这个可以通过solvepnp()做到)通过这些姿态确定。这意味着,给定予(:数学:t_1),就可以计算(:数学:t_2)。你只需要知道第二相机相对于第一相机的位置和方向。
除了立体的相关信息,该函数也可以两个相机的每一个做一个完整的校准。然而,由于在输入数据中的高维的参数空间和噪声的,可能偏离正确值。如果每个单独的相机内参数可以被精确估计(例如,使用calibratecamera()),建议您这样做,然后在本征参数计算之中使用CV_CALIB_FIX_INTRINSIC的功能。否则,如果一旦计算出所有的参数,它将会合理的限制某些参数,例如,传递CV_CALIB_SAME_FOCAL_LENGTH and CV_CALIB_ZERO_TANGENT_DIST,这通常是一个合理的假设。
与calibratecamera()类似,该函数最大限度地减少了从相机中所有可用的视图的所有点的总的重投影误差。该函数返回的重投影误差最终值。
原文链接:https://blog.csdn.net/b5w2p0/article/details/10210821