相机标定(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),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。

1.2 相机坐标系

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

1.3 世界坐标系转换为相机坐标系

⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥=[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥

其中R为3*3的旋转矩阵,t为3*1的平移矢量,(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T为世界坐标系的齐次坐标。

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

  • 图1: 

  • 像素坐标系(pixel coordinate) 

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

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

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

⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢XY1⎤⎦⎥

其中,dX、dY分别为像素在X、Y轴方向上的物理尺寸,u0,v0为主点(图像原点)坐标。

1.5 针孔成像原理

图2: 

如图,空间任意一点P与其图像点p之间的关系,P与相机光心o的连线为oP,oP与像面的交点p即为空间点P在图像平面上的投影。 

该过程为透视投影,如下矩阵表示:

s⎡⎣⎢XY1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥

其中,s为比例因子(s不为0),f为有效焦距(光心到图像平面的距离),(x,y,z,1)T是空间点P在相机坐标系oxyz中的齐次坐标,(X,Y,1)T是像点p在图像坐标系OXY中的齐次坐标。

1.6 世界坐标系转换为像素坐标系

s⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢f000f0001000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=⎡⎣⎢αx000αy0u0v01000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=M1M2Xw=MXw

其中,αx=f/dX、αy=f/dY,称为u、v轴的尺度因子,M1称为相机的内部参数矩阵,M2称为相机的外部参数矩阵,M称为投影矩阵。

2 相机内参与畸变参数

2.1 相机内参

  • 参看1.6节所述

2.2 畸变参数

  • 畸变参数(distortion parameters)

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

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

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

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

    1、径向畸变来自于透镜形状 

    2、切向畸变来自于整个摄像机的组装过程

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

  • 畸变图示 

  • 径向畸变

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

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

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

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

  • 切向畸变

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

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

    • 切向畸变图示: 

2.2.1 opencv中的畸变模型

  • 径向畸变模型:

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

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

也即:

[x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]

实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。

2.2.2 张氏标定中的畸变模型

  • 张正友的方法只考虑了径向畸变,没有考虑切向畸变

  • 模型:

    • 理想情况下(没有畸变)图片的像素坐标为:

      (u,v)
    • 真实的像素坐标为:

      (u¯,v¯)
    • 真实坐标与理想坐标的关系式(泰勒展开): 

      (x,y) and (x¯,y¯) are
      the ideal (distortion-free) and real (distorted) normalized image coordinates.

      x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
    y¯=y+y[k1(x2+y2)+k2(x2+y2)2]

    其中k1,k2是径向畸变系数(coefficients
    of the radial distortion)。

    像素坐标表示为:

    u¯=u+(u−u0)[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]

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

参考资料

【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤的更多相关文章

  1. 相机标定(Camera calibration)

    简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...

  2. [zt]摄像机标定(Camera calibration)笔记

    http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...

  3. Android 音视频开发(四):使用 Camera API 采集视频数据

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  4. Android IOS WebRTC 音视频开发总结(十三)-- ice原理

    以前在做一个视频监控项目的时候,刚开始客户没提到要支持P2P,因为服务端是我们自己写的,为了便于处理一些逻辑,全部采用转发的方式,后来客户要求支持P2P,没办法了,后来自己部署了一个STUN服务器(不 ...

  5. 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》

    简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...

  6. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  7. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

  8. Android 音视频开发(七): 音视频录制流程总结

    在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...

  9. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...

随机推荐

  1. jquery动画控制非css属性

    JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...

  2. 记WinForm中WebBrowser相关的俩个问题

    问题一:如何不让WebBrowser中弹出“安全警告” 当链接https网址时,IE会自动弹出上图中的窗口. 关闭窗口的具体思路如下: 使用WebBrowser加载中/加载完毕后触发的事件处理程序,在 ...

  3. 2-Rocketmq产品架构(参考阿里云)

    参考链接:https://help.aliyun.com/document_detail/112008.htm

  4. 初学者学习golang可能遇到的坑

    我也是个golang初学者,刚入门的话,有些"坑"还是不好发现的.如map只是定义了然后就拿来使用,变量的值覆盖等. 本来打算写一篇的,后面发现有人写的挺不错的,我就把里面的有些坑 ...

  5. Python【day 9】函数入门1

    1.什么是函数 函数的概念:对功能或者动作的封装 函数的好处:避免重复代码 2.函数的定义 1.函数的定义 def 函数名(形参列表): 函数体(return) 2.函数的调用 函数名(实参列表) 3 ...

  6. 获取post传输参数

    1.获取post参数可以用 传输参数为 a=aa&b=bb这种 public static SortedDictionary<string, string> GetRequestP ...

  7. webapi行程开发文档

    1.新建webapi项目 2.项目中controllers 中有一个values的为webapi接口 3.areas中域中有helppage为生成文档可以直接运行localhost/help,就会生成 ...

  8. vue接入腾讯防水墙代码

    vue接入腾讯防水墙代码 开始创建代码: 登陆调用方法代码

  9. rabbitMq 学习笔记(一)

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构. RabbitMQ 是采用 Erlang 语言实现 AMQP (Adva ...

  10. day 48

    目录 js BOM(浏览器对象模型) window对象 window子对象 弹出框 计时事件 DOM(文档对象模型) 查找标签 节点操作 事件 常用事件 绑定方式 jQuery jQuery介绍 jQ ...