ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Opencv单目标定flag的设定

2021-05-11 21:01:57  阅读:664  来源: 互联网

标签:设定 FIX Opencv flag flags image CALIB myfisheye size


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有