OpenCV相机标定

本文介绍了OpenCV中的相机标定过程,包括关键函数如角点检测、参数求解、畸变矫正等,并提供了程序示例,特别讨论了鱼眼相机的标定与去畸变方法。
摘要由CSDN通过智能技术生成

1.关键函数介绍

  • 棋盘格角点检测函数 cv::findChessboardCorners()
bool findChessboardCorners(
                           InputArray image,
                           Size patternSize,
                           OutputArray corners,
                           int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE );
参数说明:
InputArray image :输入的棋盘图,必须是8位的灰度或者彩色图像,类型为Mat
Size patternSize :棋盘图中每行和每列角点的个数,类型为Size
OutputArray corners:检测到的角点存储的数组,类型为vector<Point2f>
int flags :用于指定在检测棋盘格角点的过程中所应用的一种或多种过滤方法,可以使用下面的一种或多种
           CV_CALIB_CB_ADAPTIVE_THRESH 使用自适应阈值将灰度图像转化为二值图像,而不是固定的由图像的平均亮度计算出来的阈值
           CV_CALIB_CB_NORMALIZE_IMAGE 在利用固定阈值或者自适应的阈值进行二值化之前,先使用equalizeHist来均衡化图像gamma值
           CV_CALIB_CB_FILTER_QUADS 使用其他的准则(如轮廓面积,周长,类似方形的形状)来去除在轮廓检测阶段检测到的错误方块
说明:
函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到且它们都被以一定顺序排布,函数返回非零值,
否则在函数不能发现所有角点或者记录它们地情况下,函数返回0,这个函数检测到的角点坐标只是一个大约的值,找到的角点还需要使用cv::cornerSubPix()
进行精度上的优化
  • 精确化角点位置函数 void cornerSubPix()
void cornerSubPix(
                  InputArray image,
                  InputOutputArray corners,
                  Size winSize, 
                  Size zeroZone,
                  TermCriteria criteria );
参数说明:
InputArray image :输入的棋盘图
InputOutputArray corners:输入角点的初始坐标以及精准化后的坐标用于输出
Size winSize :搜索窗口边长的一半,例如如果winSize=Size(5,5),则一个大小为(5*2+1)*(5*2+1)=11*11的搜索窗口将被使用
Size zeroZone :搜索区域中间的dead region边长的一半,有时用于避免自相关矩阵的奇异性。如果值设为(-1,-1)则表示没有这个区域
TermCriteria  criteria:角点精准化迭代过程的终止条件。也就是当迭代次数超过criteria.maxCount,或者角点位置变化小于criteria.epsilon时,
停止迭代过程

TermCriteria 类:迭代算法的终止准则
class CV_EXPORTS TermCriteria
{
public:
    /**
      Criteria type, can be one of: COUNT, EPS or COUNT + EPS
    */
    enum Type
    {
        COUNT=1, //!< 最大迭代次数
        MAX_ITER=COUNT, //!< 同上
        EPS=2 //!< 迭代算法停止时所需的精度或参数的变化
    };

    //! default constructor
    TermCriteria();
    /**
    @param type The type of termination criteria, one of TermCriteria::Type
    @param maxCount The maximum number of iterations or elements to compute.
    @param epsilon The desired accuracy or change in parameters at which the iterative algorithm stops.
    */
    TermCriteria(int type, int maxCount, double epsilon);

    int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS
    int maxCount; //!< the maximum number of iterations/elements
    double epsilon; //!< the desired accuracy
}
  • 棋盘图角点绘制函数 void drawChessboardCorners()
void drawChessboardCorners( 
                           InputOutputArray image, 
                           Size patternSize,
                           InputArray corners, 
                           bool patternWasFound );
参数说明:   
InputOutputArray image :输入及输出的棋盘格图像8UC3
Size patternSize :棋盘图中每行和每列角点的个数
InputArray corners :角点坐标
bool patternWasFound :findChessboardCorners()的返回值
  • 求解相机内外参数函数calibrateCamera()
double calibrateCamera(
                       InputArrayOfArrays objectPoints,
                       InputArrayOfArrays imagePoints,
                       Size imageSize,
                       InputOutputArray cameraMatrix,
                       InputOutputArray distCoeffs,
                       OutputArrayOfArrays rvecs, 
                       OutputArrayOfArrays tvecs,
                       int flags=0,
                       TermCriteria criteria = TermCriteria( TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) );
参数说明:
InputArrayOfArrays objectPoints :世界坐标,类型为vector<vector<Vec3f>>,输入x,y,z=0
InputArrayOfArrays imagePoints :图像坐标,类型为vector<vector<Vec2f>>
Size imageSize :图像的size,用来初始化相机的内参数矩阵
InputOutputArray cameraMatrix :输出内参数矩阵
InputOutputArray distCoeffs :畸变系数,(k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]) of 4, 5, 8, 12 or 14 elements
OutputArrayOfArrays rvecs :旋转矩阵,类型为vector<Mat>
OutputArrayOfArrays tvecs :平移向量
int flags :默认为0也可以使以下几个值的组合
            CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,将包含有效的fx,fy,cx,cy的估计值的内参矩阵,作为初始值输入,然后函数对其做进一
            步优化。如果不使用这个参数,用图像的中心点初始化光轴点坐标(cx, cy),使用最小二乘法估算出fx,fy。注意,如果已知内部参数(内
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值