zoukankan      html  css  js  c++  java
  • 相机标定(Camera calibration)原理、步骤

    author@jason_ql(lql0716)
    http://blog.csdn.net/lql0716

    在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。

    常用术语
    内参矩阵: Intrinsic Matrix
    焦距: Focal Length
    主点: Principal Point
    径向畸变: Radial Distortion
    切向畸变: Tangential Distortion
    旋转矩阵: Rotation Matrices
    平移向量: Translation Vectors
    平均重投影误差: Mean Reprojection Error
    重投影误差: Reprojection Errors
    重投影点: Reprojected Points

    1、坐标系的转换
    1.1 世界坐标系
    世界坐标系(world coordinate)(xw,yw,zw)(xw,yw,zw),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。

    1.2 相机坐标系
    相机坐标系(camera coordinate)(xc,yc,zc)(xc,yc,zc),也是一个三维直角坐标系,原点位于镜头光心处,x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。

    1.3 世界坐标系转换为相机坐标系
    ⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥=[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥
    [xcyczc1]=[Rt01][xwywzw1]
    其中RR为3*3的旋转矩阵,tt为3*1的平移矢量,(xc,yc,zc,1)T(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T(xw,yw,zw,1)T为世界坐标系的齐次坐标。

    1.4 像素坐标系、图像坐标系
    图1:


    像素坐标系(pixel coordinate)
    如图1,像素坐标系uovuov是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点oo位于图像的左上角,uu轴、vv轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素(整数)。

    像素坐标系不利于坐标变换,因此需要建立图像坐标系XOYXOY,其坐标轴的单位通常为毫米(mm),原点是相机光轴与相面的交点(称为主点),即图像的中心点,XX轴、YY轴分别与uu轴、vv轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。

    图像坐标系转换为像素坐标系

    ⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢XY1⎤⎦⎥
    [uv1]=[1/dX0u001/dYv0001][XY1]
    其中,dXdX、dYdY分别为像素在XX、YY轴方向上的物理尺寸,u0,v0u0,v0为主点(图像原点)坐标。

    1.5 针孔成像原理
    图2:


    如图,空间任意一点PP与其图像点pp之间的关系,PP与相机光心oo的连线为oPoP,oPoP与像面的交点pp即为空间点PP在图像平面上的投影。
    该过程为透视投影,如下矩阵表示:

    s⎡⎣⎢XY1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥
    s[XY1]=[f0000f000010][xyz1]
    其中,ss为比例因子(ss不为0),ff为有效焦距(光心到图像平面的距离),(x,y,z,1)T(x,y,z,1)T是空间点PP在相机坐标系oxyzoxyz中的齐次坐标,(X,Y,1)T(X,Y,1)T是像点pp在图像坐标系OXYOXY中的齐次坐标。

    1.6 世界坐标系转换为像素坐标系
    s⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢f000f0001000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=⎡⎣⎢αx000αy0u0v01000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=M1M2Xw=MXw
    s[uv1]=[1/dX0u001/dYv0001][f0000f000010][Rt01][xwywzw1]=[αx0u000αyv000010][Rt01][xwywzw1]=M1M2Xw=MXw
    其中,αx=f/dXαx=f/dX、αy=f/dYαy=f/dY,称为uu、vv轴的尺度因子,M1M1称为相机的内部参数矩阵,M2M2称为相机的外部参数矩阵,MM称为投影矩阵。

    2 相机内参与畸变参数
    2.1 相机内参
    参看1.6节所述
    2.2 畸变参数
    畸变参数(distortion parameters)

    畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。

    简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。

    畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能由于摄像机镜头的原因。

    畸变一般可以分为:径向畸变、切向畸变

    1、径向畸变来自于透镜形状
    2、切向畸变来自于整个摄像机的组装过程

    畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著

    畸变图示


    径向畸变

    实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。

    如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。


    对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。

    径向畸变包括:枕形畸变、桶形畸变

    切向畸变

    切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。

    切向畸变可分为:薄透镜畸变、离心畸变

    切向畸变图示:


    2.2.1 opencv中的畸变模型
    径向畸变模型:
    以下公式由泰勒展式得出,在opencv中K=1K=1,r2=x2+y2r2=x2+y2, (x,y)(x,y)为真实坐标(发生畸变),(x′,y′)(x′,y′)为理想坐标。

    δxr=x(k1r2+k2r4+k3r6+K)
    δxr=x(k1r2+k2r4+k3r6+K)
    δyr=y(k1r2+k2r4+k3r6+K)
    δyr=y(k1r2+k2r4+k3r6+K)
    切向畸变模型:
    δxd=2p1xy+p2(r2+2x2)+K
    δxd=2p1xy+p2(r2+2x2)+K
    δyd=2p1(r2+2y2)+2p2xy+K
    δyd=2p1(r2+2y2)+2p2xy+K
    理想坐标(x′,y′)(x′,y′)与真实坐标(x,y)(x,y):
    x′=x+δxr+δxd
    x′=x+δxr+δxd
    y′=y+δyr+δyd
    y′=y+δyr+δyd
    也即:

    [x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]
    [x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]
    实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。

    2.2.2 张氏标定中的畸变模型
    张正友的方法只考虑了径向畸变,没有考虑切向畸变

    模型:

    理想情况下(没有畸变)图片的像素坐标为:
    (u,v)
    (u,v)
    真实的像素坐标为:
    (u¯,v¯)
    (u¯,v¯)
    真实坐标与理想坐标的关系式(泰勒展开):
    (x,y)(x,y) and (x¯,y¯)(x¯,y¯) are the ideal (distortion-free) and real (distorted) normalized image coordinates.
    x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
    x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
    y¯=y+y[k1(x2+y2)+k2(x2+y2)2]
    y¯=y+y[k1(x2+y2)+k2(x2+y2)2]
    其中k1k1,k2k2是径向畸变系数(coefficients of the radial distortion)。

    像素坐标表示为:
    u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2]
    u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2]
    v¯=v+(v−v0)[k1(x2+y2)+k2(x2+y2)2]
    v¯=v+(v−v0)[k1(x2+y2)+k2(x2+y2)2]
    即:
    [(u−u0)(x2+y2)(v−v0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)][k1k2]=[u¯−uv¯−v]
    [(u−u0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)(v−v0)(x2+y2)][k1k2]=[u¯−uv¯−v]
    2.2.3 Tasi畸变模型
    Tasi畸变模型同张氏畸变模型类似,也只考虑了径向畸变
    2.3 相机标定
    相机标定步骤:
    1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
    2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
    3、从照片中提取棋盘格角点。
    4、估算理想无畸变的情况下,五个内参和六个外参。
    5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
    6、极大似然法,优化估计,提升估计精度。
    3 Matlab相机标定
    打开matlab,找到“Camera Calibrator”并打开


    在新窗口中选择添加图片“Add Images”


    添加图片之后,会有如下提示,设置棋盘格的实际大小之后,点击ok


    点击“Calibrate”开始计算


    点击“Export Camera Parameters”,输出到matlab命令窗口


    导出的数据如下:
    cameraParams =

    cameraParameters (具有属性):

    Camera Intrinsics
    IntrinsicMatrix: [3x3 double]
    FocalLength: [510.6720 511.9534]
    PrincipalPoint: [332.3800 238.4849]
    Skew: 0

    Lens Distortion
    RadialDistortion: [0.0618 -0.4877]
    TangentialDistortion: [0 0]

    Camera Extrinsics
    RotationMatrices: [3x3x50 double]
    TranslationVectors: [50x3 double]

    Accuracy of Estimation
    MeanReprojectionError: 0.1923
    ReprojectionErrors: [77x2x50 double]
    ReprojectedPoints: [77x2x50 double]

    Calibration Settings
    NumPatterns: 50
    WorldPoints: [77x2 double]
    WorldUnits: 'mm'
    EstimateSkew: 0
    NumRadialDistortionCoefficients: 2
    EstimateTangentialDistortion: 0


    estimationErrors =

    cameraCalibrationErrors (具有属性):

    IntrinsicsErrors: [1x1 intrinsicsEstimationErrors]
    ExtrinsicsErrors: [1x1 extrinsicsEstimationErrors]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    在命令窗口输入以下命令即可获得内参矩阵和径向畸变:
    >> cameraParams.IntrinsicMatrix

    ans =

    510.6720 0 0
    0 511.9534 0
    332.3800 238.4849 1.0000

    >> cameraParams.RadialDistortion

    ans =

    0.0618 -0.4877
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    参考资料
    相关文章

    机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新……)
    旋转矩阵、欧拉角、四元数理论及其转换关系
    基于生长的棋盘格角点检测方法–(1)原理介绍

    opencv角点检测、棋盘格检测、亚像素cvFindCornerSubPix()

    相机标定(Camera calibration)

    OpenCV相机标定和姿态更新

    Camera Calibration and 3D Reconstruction

    Camera Calibration

    相机姿态估计(二)–单目POSIT算法

    相机位姿估计1:根据四个特征点估计相机姿态

    Head Pose Estimation using OpenCV and Dlib

    opencv角点检测、棋盘格检测、亚像素cvFindCornerSubPix()

    关于OpenCV的那些事——相机标定

    计算机视觉-相机内参数和外参数

    张正友相机标定算法 【2】

    Python+OpenCV学习(17)—摄像机标定

    相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)

    张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)

    MATLAB–相机标定教程

    《学习opencv》

    张正友相机标定论文《A Flexible New Technique for Camera Calibration》

    OpenCV相机标定

    畸变模型

    相机的那些事儿 - 概念、模型及标定

    相机标定(二)之相机畸变模型
    ————————————————
    版权声明:本文为CSDN博主「jason_ql」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lql0716/java/article/details/71973318

  • 相关阅读:
    MySQL limit 分页查询优化(百万级优化)
    HAVING 搜索条件在进行分组操作之后应用
    Mysql 多表连接查询 inner join 和 outer join 的使用
    php7 configure: error: Cannot find OpenSSL's <evp.h> 问题解决
    解决Cannot find config.m4 Make sure that you run '/home/php/bin/phpize' in the top level source directory of the module
    Ubuntu下彻底卸载默认安装的mysql,自己手动下载安装MYSQL
    mysql 运算操作符
    mysql 函数表
    【mysql】连接和断开服务器
    mysql 5.7 增删改查及别名的用法
  • 原文地址:https://www.cnblogs.com/Ph-one/p/13073654.html
Copyright © 2011-2022 走看看