未经博主允许不得转载https://blog.csdn.net/a083614/article/details/78579163

最近做项目要用到标定,因为是小白,很多东西都不懂,于是查了一堆的博客,但没有一个博客能让我完全能看明白整个过程,绝大多数都讲的不全面,因此自己总结了一篇博客,给自己理一下思路,也能够帮助大家。(张正友标定的详细求解还未完全搞明白,后面再加)

参考博客:
相机标定(Camera calibration)原理、步骤
(http://blog.csdn.net/lql0716/article/details/71973318?locationNum=8&fps=1)

相机标定内容详解 (转载自祥的博客)
(http://blog.csdn.net/humanking7/article/details/44756073)

张正友标定介绍
(http://blog.csdn.net/heroacool/article/details/50286677)

[图像]摄像机标定(2) 张正友标定推导详解
(http://blog.csdn.net/humanking7/article/details/44756235)

MATLAB–相机标定教程
(http://blog.csdn.net/heroacool/article/details/51023921)

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

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

相机的畸变和内参是相机本身的固有特性,标定一次即可一直使用。但由于相机本身并非理想的小孔成像模型以及计算误差,采用不同的图片进行标定时得到的结果都有差异。一般重投影误差很小的话,标定结果均可用。

坐标转换基础

在视觉测量中,需要进行的一个重要预备工作是定义四个坐标系的意义,即 摄像机坐标系图像物理坐标系、图像像素坐标系世界坐标系(参考坐标系)

一、图像坐标系(x,y)至像素坐标系(u,v)

1.两坐标轴互相垂直

此时有

2.一般情况,两轴不互相垂直

此时有

写成矩阵形式为:

二、相机坐标系(Xc,Yc,Zc)至图像坐标系(x,y)

(根据小孔成像原理,图像坐标系应在相机坐标系的另一边,为倒立反向成像,但为方便理解和计算,故投影至同侧。)

根据三角形相似性原理得:

三、世界坐标系(Xw,Yw,Zw)至相机坐标系(Xc,Yc,Zc)

###四、合并公式

其中

畸变

畸变一般可以分为:径向畸变、切向畸变
ps:畸变是相机本身的固有特性,和相机内参相同,标定一次之后即可。

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

畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著,所以忽略不计。

径向畸变(桶形畸变和枕形畸变):
实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。
如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。

对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。
对于径向畸变可以通过下面的泰勒级数展开式进行校正:

这里的x、y是图像中的畸变后的位置坐标,通过校正得到真实坐标。r是该点距成像中心的距离。

切向畸变(薄透镜畸变和离心畸变):

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

切向畸变可以通过如下公式来矫正:


这里的x、y是图像中的畸变后的位置坐标,通过校正得到真实坐标。r是该点距成像中心的距离。

opencv畸变模型

径向畸变模型:

xc= xd (1+k1r^2 +k2r^4 +k3r^6+⋯)
yc= yd (1+k1
r^2 +k2r^4 +k3r^6+⋯)

切向畸变模型:

xc= 2p1xdyd+p2 (r^2 +2xd^2 )
yc= 2p2xdyd+p1 (r^2 +2yd^2 )

可得:

xc= xd (1+k1r^2 +k2r^4 )+2p1xdyd+p2 (r^2 +2xd^2 )
yc= yd (1+k1r^2 +k2r^4 )+2p2xdyd+p1 (r^2 +2yd^2 )

xd,yd为图像中的点(存在畸变),xc,yc是畸变校正后的点。
由公式可得畸变有k1,k2,k3,p1,p2五个参数,对于质量比较好的相机来说,切向畸变很小,可忽略,径向畸变系数k3也可忽略,只计算k1,k2两个参数。张正友标定中就默认为p1,p2为0。

标定方法

1、传统相机标定

最简单的相机标定为线性标定,即不考虑相机的畸变而只考虑空间坐标转换。
每个坐标点有X,Y两个变量,可列两个方程,相机内参有5个未知数,外参平移和旋转各3个,共有11个变量,因此至少需要6个特征点来求解。

2、非线性标定

当镜头畸变明显时必须考虑畸变,一般较为便宜的网络摄像头畸变特别大,而价格较贵的工业摄像头则畸变很小,因为其中已经嵌入了许多消除畸变的程序。这时线性模型转化为非线性模型,需要通过非线性标定方法求解。有最速下降法,遗传算法,高斯牛顿法和神经网络算法等。

3、张正友标定介绍

(张正友标定只考虑了径向畸变,没有考虑切向畸变)

由上面的坐标转换可得:


H即为单应性矩阵

H为3x3矩阵,并且有一个元素作为齐次坐标,则有8个未知元素,一组坐标对应两个方程,则至少需要四组对应的点即可算出单应性矩阵H。

因为R旋转矩阵为正交矩阵,存在:

代入H可得求出两组A和H的公式:

矩阵A包含5个元素,需要3组H方可解出A的唯一封闭解,因此在标定时需拍摄3组以上的图片。由A可计算出相应的外参矩阵。在上述计算中,忽略了相机畸变的影响。对内外参应用最小二乘方法估计实际存在的径向畸变的畸变系数(忽略切向畸变),最后通过极大似然法进行优化,得到精度较高的解。

标定过程

相机标定步骤:

1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3、从照片中提取棋盘格角点。
4、估算理想无畸变的情况下,五个内参和六个外参。
5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
6、极大似然法,优化估计,提升估计精度。

Matlab工具箱标定:

1、应用程序中找到Camera Calibration

2、添加标定板拍摄图片(按Ctrl可一次添加多张)

3、输入棋盘格每格的尺寸大小

4、显示已检测出的棋盘格,点击Calibration,开始标定。

5、得到标定结果(平均误差小于0.5即可认为结果可靠,这个地方我还不是很清楚)

6、可查看标定结果和程序

opencv标定

1、循环读取图片
2、使用findChessboardCorners函数检测角点(需提前输入角点数)。

3、使用find4QuadCornerSubpix函数对角点进行亚像素精确化
4、可用drawChessboardCorners将角点显示。
5、根据角点数和尺寸创建一个理想的棋盘格(用point向量存储所有理论上的角点坐标)。
6、通过calibrateCamera函数由理想坐标和实际图像坐标进行标定,可得到标定结果。
7、由projectPoints函数计算反向投影误差。

标定结果:

matlab标定的内参经过转置与VS标定的内参基本一致。
每一幅图像都有一个外参矩阵,它的作用是:通过将棋盘格上坐标系上的角点坐标(x,y,0,1)(计算过程中设定参考坐标系在棋盘格上左上方角点,Z轴垂直棋盘格平面,因此z为0,1表示齐次坐标)左乘外参矩阵再左乘内参矩阵可以得到该外参矩阵对应图像中的相应角点坐标。VS的标定结果经过代入点进行上述计算得到的坐标与图像基本一致,但matlab的结果不同直接代入并不相同。原因在于两种方法标定的结果表示形式不同,两种方法结果中外参矩阵的平移向量相同,但旋转矩阵结果不一致,估计是内部实现不同。ps:平时事情比较多,更新比较慢。

ps:如上图opencv标定结果中内参矩阵里的2168和2174并不是焦距,而是焦距/每个像素大小,否则数量级不会这么大,焦距一般只有几毫米或几十毫米。刚看到国内的硕士论文里有人写错了。

最详细、最完整的相机标定讲解相关推荐

  1. 机器视觉-相机标定及畸变矫正

    摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R.T.K.D中包含相机的5个内参,6个外参.然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数. ...

  2. 工业互联网(十四)——相机标定(Camera calibration)原理、步骤

    转载: 最详细.最完整的相机标定讲解 图像处理--相机标定(Camera calibration) 相机标定 相机标定(Camera calibration)原理.步骤 工业相机标定相关知识整理 相机 ...

  3. 相机标定和ORBSLAM2/VINS测试

    目录 一.相机标定 1.1 标定目的 1.2 常见模型介绍 1.2.1 相机模型 1.2.2 畸变模型 1.3 双目标定 1.3.1 常见标定工具及对应使用场景 1.3.2 Kalibr标定 1.3. ...

  4. MatLab的双目相机标定和orbslam双目参数匹配

    本文承接ROS调用USB双目摄像头模组 目录 相机标定 导出为YAML文件(也可以手动粘贴) 生成可用于ORB-SLAM2的yaml文件 生成可用于ORB-SLAM3的yaml文件 2022.5.6补 ...

  5. 立体视觉入门指南(3):相机标定之张式标定法【超详细值得收藏】

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  6. 非常详细的相机标定原理、步骤(一)

    目录 一.什么是相机标定 二.坐标系 1.世界坐标系(word Coordinate) 2.相机坐标系(camera coordinate) 3.世界坐标系到相机坐标系转换 三.总结: 非常详细的相机 ...

  7. 相机标定(五)—— 相机模型详细介绍

    相机模型 相机与图像的一些基本概念 针孔相机模型 坐标系介绍 世界坐标系 相机坐标系(光心坐标系) 图像坐标系 像素坐标系 成像过程的数学模型 世界坐标系->相机坐标系 相机坐标系–>像平 ...

  8. 双目相机标定OpenCV源码讲解

    双目相机标定OpenCV源码讲解 背景介绍 所述内容 参考资料 摄像机标定部分代码 代码思路 代码中的其他函数 找角点&求内参 求外参 求矫正映射矩阵 后记 背景介绍 暑假接近两个月的时间做了 ...

  9. 最简单的针孔相机模型标定方法,使用Matlab进行快速可视化相机标定,小白专用,超详细

    相机标定是机器视觉.SLAM等绕不开的环节,今天介绍一种最为简单的可视化标定方法. 这篇文章只是讲解如果标定,关于相机的标定原理,可以参考别的文章,这里推荐一篇<[机器视觉]张氏法相机标定> ...

最新文章

  1. jboss的几个常用操作
  2. php操作mysql的封装类_PHP封装的mysqli数据库操作类示例
  3. react jest测试_如何使用React测试库和Jest开始测试React应用
  4. qt 文字倾斜投影_帅呆!钢铁侠中的激光投影键盘终于量产了,炫酷又好用
  5. CentOS安装图文教程
  6. 面试率 90% 的JS事件循环Event Loop,看这篇就够了!! !
  7. python for loop步进值_Python for 循环语句
  8. android 获取sim卡信息list_提醒:手机要设置SIM卡密码!如何设置?有何用处?攻略来了...
  9. elf section类型_ELF 转二进制(2/4): 允许把 Binary 文件加载到任意位置
  10. chrome java支持_如何将JAVA插件支持Chrome
  11. r语言 html 变为ppt,如何用R来定制个性化PPT
  12. Lync学习资料分享
  13. 写一个程序,将接收的华氏温度转换为对应的摄氏温度。
  14. html外链自动加nofollow,WordPress文章/页面外链自动添加nofollow属性的方法
  15. 后期维特根斯坦的语境观“:语言游戏”与“生活形式”
  16. pytorch 模型中的bn层一键转化为同步bn(syncbn)
  17. 如何让图片跟随div大小自动填满
  18. obs和red5以及网页视频播放器实行直播
  19. 香港商报:高铁出行受港人热捧 逐渐融入市民生活
  20. STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储

热门文章

  1. 如何将图片存到数据库中,并在前台显示:
  2. linux学习笔记-windows和linux文件互传
  3. 删除Android刷机启动开机向导(气泡提示)
  4. 运算符 分支语句 轮播图
  5. ApacheCN 翻译活动进度公告 2019.4.28
  6. PDSCH type0/type1
  7. 手动安装docsify
  8. SQL @005 收缩日志
  9. BackTrack 5 ARM For N900
  10. 听雷哥浅谈Redis