Opencv单目标定flag的设定
作者:互联网
1. flag中的标签顺序:
在代码中的对应如下:
enum{
CALIB_USE_INTRINSIC_GUESS = 1 << 0,
CALIB_RECOMPUTE_EXTRINSIC = 1 << 1,
CALIB_CHECK_COND = 1 << 2,
CALIB_FIX_SKEW = 1 << 3,
CALIB_FIX_K1 = 1 << 4,
CALIB_FIX_K2 = 1 << 5,
CALIB_FIX_K3 = 1 << 6,
CALIB_FIX_K4 = 1 << 7,
CALIB_FIX_INTRINSIC = 1 << 8,
CALIB_FIX_PRINCIPAL_POINT = 1 << 9
};
其中最低位为:CALIB_USE_INTRINSIC_GUESS , 最高位为: CALIB_ZERO_DISPARITY
int flags = 0;
flags |= myfisheye::CALIB_RECOMPUTE_EXTRINSIC;
flags |= myfisheye::CALIB_CHECK_COND;
flags |= myfisheye::CALIB_FIX_SKEW;
flags |= myfisheye::CALIB_FIX_K4;
std::cout <<"flags = " << flags <<std::endl;
如上面那段代码的设定,flags的打印值为142, 转换成二进制入下:
与上面的顺序对应
写得时候记得区分, 因为cv::fisheye对应的参数,与cv:: 对应的参数是不一样的;
举例,比较经典的鱼眼单目标定程序如下:
cv::Matx33d intrinsic_matrix; /***** 摄像机内参数矩阵 ****/
cv::Vec4d distortion_coeffs; /* 摄像机的4个畸变系数:k1,k2,k3,k4*/
std::vector<cv::Vec3d> rotation_vectors; /* 每幅图像的旋转向量 */
std::vector<cv::Vec3d> translation_vectors; /* 每幅图像的平移向量 */
int flags = 0;
flags |= myfisheye::CALIB_RECOMPUTE_EXTRINSIC;
flags |= myfisheye::CALIB_CHECK_COND;
flags |= myfisheye::CALIB_FIX_SKEW;
//需要传入cornerSeq的点对应的id,去确定其是属于第几行第几列
myfisheye::calibrate(object_Points, corners_Seq, corners_Id, image_size,
intrinsic_matrix, distortion_coeffs, rotation_vectors,
translation_vectors, flags,
cv::TermCriteria(3, 30, 1e-5));
接下来说一下每个flag参数所表达的意思:
CALIB_RECOMPUTE_EXTRINSIC: 是否重新计算外参;如果设定为true,则每一轮的迭代优化后都会重新计算一次rvec和tvec, 也就是每一副图像相对于固定的世界坐标系的外参R,t;一般都会开启;
CALIB_USE_INTRINSIC_GUESS: 是否使用输入的内参;如果设定为True,则上面例子中的intrinsic_matrix必须有值;如果设定为False,opencv默认的初始化参数计算如下;
CALIB_FIX_INTRINSIC:是否固定内参;如果设定为True, 则上面例子中的intrin_matrix必须有精确地内参值, 在接下来的单目标定程序中,不会改变这个内参;
这里要和上面的CALIB_USE_INTRINSIC_GUESS做区分, CALIB_USE_INTRINSIC_GUESS是给定一个比较合理的初始值即可,防止后面的优化无法收敛;
CALIB_CHECK_COND: 是否检测条件; 检测最后的雅克比公式中B矩阵是不是满秩矩阵,在鱼眼标定的时候,一般设置为True,可以帮我们筛选掉不好的标定图片;
CALIB_FIX_SKEW:保证内参矩阵的对称性;如果设定为True,内参矩阵的格式为[ fx, 0, cx; 0, fy,cy; 0, 0,1] ;如果设定为false,则内参格式为 [fx' , alpha , cx; 0, fy' ,cy; 0, 0,1], 一般设定为True;
CALIB_FIX_K1,K2,K3,K4:是否固定某个畸变参数; 如果选择CALIB_FIX_K4, 对应的畸变参数为:[K1, K2,K3,0], 同理,如果CALIB_FIX_K3, 则对应的畸变参数为[K1,K2,0,0]
OpenCV源码内参初始化为:
fx = max(image_size.width, image_size.height) / CV_PI;
fy = max(image_size.width, image_size.height) / CV_PI);
cx = image_size.width / 2.0 - 0.5;
cy = image_size.height / 2.0 - 0.5;
CALIB_FIX_SKEW 使用举例:
标签:设定,FIX,Opencv,flag,flags,image,CALIB,myfisheye,size 来源: https://blog.csdn.net/qq_25458977/article/details/116648270