前言

在相机标定过程中,我们会碰到一些概念,比如:摄像机模型、世界坐标系、图像坐标系等等。为便于理解推导,所以又整理了相关的笔记,介绍的都是些比较基础的概念,也比较容易。

相机模型

针孔相机模型

注:下面的两幅图片摘自:
http://blog.csdn.net/xuelabizp/article/details/50314633

上图是现实中针孔相机的成像模型,物体的投影与物体本身总是相反的。坐标也会是相反的,比较不方便。


正如前面所说的,实际的针孔相机模型,考虑起来不太方便,于是我们可以等效地表示成上图所示形式(相似三角形,比例相同)。

注:下图摘自:
https://www.cnblogs.com/Jessica-jie/p/6596450.html

如图是一个小孔模型。

  • O点是相机中心,也就是小孔,同时也是整个相机坐标系的中心;
  • z轴是相机的主轴;
  • 坐标系oxyz构成了相机坐标系;
  • q点是点Q在像平面上的投影,所在平面为图像坐标系;
  • O1点为主点,主轴与像平面相交的点;
  • 在像平面上的坐标系为图像坐标系,其x、y轴与相机坐标系的x、y轴相平行;
  • O点到O1点的距离为相机的焦距f;

四个坐标系

摄像机中的坐标系有4个,均为右手坐标系,分别有:世界坐标系、相机坐标系、图像坐标系、像素坐标系。后面用几个简写字母分别表示:w、c、pic、pix。

  1. 世界坐标系:(Xw,Yw,Zw)(X_w, Y_w, Z_w),用户自己定义的三维空间坐标系,表示物体在空间的实际位置,用来秒速三维空间中物体与相机之间的坐标位置关系,度量值为米(m);
  2. 相机坐标系:(Xc,Yc,Zc)(X_c, Y_c, Z_c),以相机的光心(前面的O点)为原点,ZcZ_c轴与光轴重合,垂直于成像平面,度量值为米(m);
  3. 图像坐标系:(Xpic,Ypic)(X_{pic}, Y_{pic}),位于图像平面上,是个二维坐标系,XpicX_{pic}和YpicY_{pic}分别与相机坐标系中的XcX_{c}和YcY_{c}相平行,度量值为米(m);
  4. 像素坐标系:(Xpix,Ypix)(X_{pix}, Y_{pix}),同样位于图像平面上,与图像坐标系的区别:一、以左上角为原点;二、单位为像素。也经常表示为(u,v)(u, v)。

坐标系之间的转换

世界坐标系 -> 相机坐标系

设某点在世界坐标系中的坐标为(xw,yw,zw)(x_w, y_w, z_w) (xw,yw,zw)(x_w, y_w, z_w),在相机坐标系中的矩阵为(xc,yc,zc)(x_c, y_c, z_c)。
则两个坐标系之间的关系为:

⎡⎣⎢xcyczc⎤⎦⎥=R⎡⎣⎢xwywzw⎤⎦⎥+t

\begin{bmatrix} x_c \\ y_c \\ z_c \end{bmatrix} = R \begin{bmatrix} x_w \\ y_w \\ z_w \end{bmatrix} + t
其中: RR为一个3×33 \times 3的旋转矩阵,T是一个 3×13 \times 1的矩阵,表示偏移;
表示成齐次形式:

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

\begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
确定 RR需要3个参数,确定tt也需要3个参数,总计6个参数,称为 外部参数

相机坐标系 -> 图像坐标系

以OO点为原点建立相机坐标系,点Q(xc,yc,zc)Q(x_c, y_c, z_c)为相机坐标系空间中的任意一点,假设该点被光线投影到平面上的q(xpic,ypic)q(x_{pic}, y_{pic})点上。
注意到小孔模型中的相似三角形关系,我们可以得到:

fzc=xpicxc=ypicyc

\frac{f}{z_c} = \frac{x_{pic}}{x_c} = \frac{y_{pic}}{y_c}

{xpic=fxczcypic=fyczc

\begin{cases} x_{pic} = f \frac{x_c}{z_c} \\ y_{pic} = f \frac{y_c}{z_c} \end{cases}
写成矩阵形式:

zc⎡⎣⎢xpicypic1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⋅⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥

z_c \begin{bmatrix} x_{pic} \\ y_{pic} \\ 1 \end{bmatrix} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix}

图像坐标系 -> 像素坐标系

这里看下这个图,很好理解:

先设每个像素的物理尺寸为 dx×dy(mm2)d_x \times d_y (mm^2) 。
那么对于点在像素坐标系中的坐标(u,v)(u, v):

⎧⎩⎨u=u0+xpicdxv=v0+ypicdy

\begin{cases} u = u_0 + \frac{x_{pic}}{dx} \\ v = v_0 + \frac{y_{pic}}{dy} \end{cases}
写成矩阵形式:

⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢⎢⎢⎢⎢1dx0001dy0u0v01⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢xpicypic1⎤⎦⎥

\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x} & 0 & u_0 \\ 0 & \frac{1}{d_y} & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{pic} \\ y_{pic} \\ 1 \end{bmatrix}

世界坐标系 -> 像素坐标系

把前面几个步骤都综合一下:

zc⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢⎢⎢⎢⎢1dx0001dy0u0v01⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢f000f0001000⎤⎦⎥⋅[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥

z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x} & 0 & u_0 \\ 0 & \frac{1}{d_y} & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
化简一下:

zc⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢fx000fy0u0v01000⎤⎦⎥⋅[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥

z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & u_0 & 0 \\ 0 & f_y & v_0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
其中: fx=fdxf_x = \frac{f}{d_x}, fy=fdyf_y = \frac{f}{d_y}。

  1. 第一个矩阵中的fxf_x、fyf_y、u0u_0、v0v_0这4个参数称做相机的内部参数,因为他们只与相机有关,与其他因素无关;
  2. 第二个矩阵中的RR、TT,称作相机的外部参数,因为只要世界坐标系和相机坐标系的相对位置关系发生改变,它们就会改变,每一张图片的RR、TT都是唯一的;
  3. 单目摄像机标定就是在已知像素坐标系下的坐标和世界坐标系的坐标,求解出内部参数的过程。

透镜畸变

到前面为止的内容都是有关针孔相机模型的,但是针孔可以透过的光线太少,成像慢且不清晰,所以往往都会加上凸透镜以汇聚更多的光线。但是加上凸透镜之后,不可避免地,就会产生透镜畸变。透镜畸变有两种:径向畸变、切向畸变。

径向畸变

对于某些透镜,光线在远离透镜中心的地方比靠近中心的地方弯曲更厉害,产生“筒形”或“鱼眼”现象。
一般来讲,成像中兴点的径向畸变为0,越向边缘移动,畸变越严重。通常,径向畸变通过下面的公式来校正,常用偶次幂的泰勒公式描述径向畸变:

{xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)

\begin{cases} x_{corrected} = x(1+k_1 r^2 + k_2 r^4 + k3 r^6) \\ y_{corrected} = y(1+k_1 r^2 + k_2 r^4 + k3 r^6)\end{cases}
其中: (x,y)(x, y)为畸变点在成像平面上的原始位置, rr为该点到成像面中心的距离,(xcorrected,ycorrected)(x_{corrected}, y_{corrected})为校正后的新位置。

切向畸变

切向畸变是由于摄像机制造上的缺陷使得透镜本身与图像平面不平行而产生的,可定量描述为:

{xcorrected=x+[2p1y+p2(r2+2x2)]ycorrected=y+[p1(r2+2y2)+2p2x]

\begin{cases} x_{corrected} = x + [2 p_1 y + p_2(r^2 + 2 x^2)] \\ y_{corrected} = y + [ p_1(r^2 + 2 y^2) + 2 p_2 x] \end{cases}
其中: (x,y)(x, y)为畸变点在成像平面上的原始位置, rr为该点到成像面中心的距离,(xcorrected,ycorrected)(x_{corrected}, y_{corrected})为校正后的新位置。
现在的摄像机一般不会产生切向畸变,所以通常不考虑其影响。

透镜畸变校正

我们进行透镜畸变校正,就是要确定k1k_1、k2k_2、k3k_3、p1p_1、p2p_2这5个参数。

相机标定

  1. 相机标定得到的是4个内部参数,相机畸变校正得到的是5个畸变校正参数;
  2. 单目相机标定常用的工具有OpenCV和MATLAB,下一篇博客再进行程序实现。

参考资料:

  1. http://blog.csdn.net/aptx704610875/article/details/48914043
  2. http://blog.csdn.net/xuelabizp/article/details/50314633
  3. https://www.cnblogs.com/Jessica-jie/p/6596450.html

三维重建学习(2):相机标定基础相关推荐

  1. 北邮鲁鹏老师三维重建课程之相机标定

    在看北邮鲁鹏老师的三维重建的课程过程中,去官网找到有三个作业.现将三个作业里面的第一个作业相机标定完成.总体来说,可以分为三个部分,即图像坐标点和世界坐标点的获取:映射矩阵的生成,相机内外参的求解三个 ...

  2. 相机标定基础【1】- 在Visual Station 2019 上搭建OpenCV应用 (1)- 安装配置VS

    本文为在VS 2019上安装OpenCV的应考虑: 版本.X64.设置的路径等 , 1 访问微软VS网站 选择免费的社区版本下载,安装. 先下载的是一个引导程序,然后,通过网页边下载边安装 2 配置V ...

  3. 三维重建学习(3):张正友相机标定推导

    前言 前面的几篇博客中介绍了有关相机标定的基础知识(三维重建学习(1):基础知识:旋转矩阵与旋转向量.三维重建学习(2):相机标定基础).这次介绍一个十分经典的单目相机标定方法--张正友标定,并给出数 ...

  4. 直播预告:深度学习驱动下的相机标定技术发展

    个人介绍: 廖康博士,毕业于北京交通大学信息科学研究所,师从林春雨教授.将赴新加坡南洋理工大学S-Lab担任博士后研究员,合作导师为Chen Change Loy.曾于德国马克斯·普朗克研究所(马普所 ...

  5. 三维重建学习(5):简单地从数学原理层面理解双目立体视觉

    前言 这是我前段时间学习双目视觉时做的笔记,这一篇文章不会进行过于细致的推导,仅仅会在一些理想情况下做一些简单的推导,目标是得到一个直观上的认识:双目视觉是如何得到三维立体坐标的.以后的博客还会再放上 ...

  6. 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解

    目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...

  7. 如何高效学习3D视觉?涉及点云处理/相机标定/三维重建/SLAM/结构光/深度估计...

    「您好,我之前一直做2D视觉,请问3D视觉如何开始入门呀?三维重建.相机标定.立体匹配.结构光.点云后处理,这些我今后的工作可能都会涉及,可是我目前还一窍不通,您有什么比较好的方法适合快速入门吗?」 ...

  8. 中秋福利!三维重建/SLAM/点云/相机标定/深度估计/缺陷检测课程

    人工智能渗入到越来越多领域,以计算机视觉为主的相关应用更是呈现爆发性增长,国内外资本对AI视觉兴趣只增不减,自动驾驶.工业视觉.AR/VR.测量测绘.移动机器人等领域涌现了大量独角兽公司,呈现了以3D ...

  9. 元旦特惠!无人机/ROS2/三维重建点云/SLAM/多传感器/相机标定/深度估计等重磅干货教程...

    随着AI技术的大规模落地,国内外资本对AI视觉兴趣只增不减,自动驾驶.工业视觉.AR/VR.测量测绘.移动机器人等领域涌现了大量独角兽公司,相关产品更是受到重点关注. AI领域的热度和资本涌入持续增长 ...

最新文章

  1. 漫画:什么是 “设计模式” ?
  2. tcp reno 介绍
  3. arcgis python脚本实现从界面选择输入输出_arcgis python脚本实现从界面选择输入输出_ArcGIS Python编程案例(2)-使用ArcPy编写脚本......
  4. 企业网络推广——企业网络推广专员提高网站更新讲策略
  5. Ubuntu 18.04 固定ip 设置方法
  6. ajax mode,DWR的三种Reverse Ajax Mode配置详解
  7. AT3968-[AGC025E] Walking on a Tree【构造】
  8. dp---数字三角形问题
  9. L1-007 念数字 (10 分)—团体程序设计天梯赛
  10. 15.MongoDB的一致性(读关注与写关注)
  11. R可能让您惊喜的10件事
  12. java编程——图片旋转
  13. 0832科技_iDS-MCB601-A/0832 海康威视深度学习布控枪摄像机 8-32mm 移动便携监控
  14. android中jni的调用过程,Android 调用jni的过程简述
  15. Vue电影网站构建实战教程
  16. Notepad Next:Linux 用户的 Notepad++ 最佳替代品
  17. 《投资中最简单的事》”第二部分--投资办法“读书笔记
  18. c语言中常量单双引号,C语言常量中字元与字串 除了单引号与双引号的区别外,还有什么不同。...
  19. TypeError: __init__() takes exactly 2 arguments (3 given)
  20. marathon错误记录

热门文章

  1. sign的oracle,oracle sign
  2. php html实例代码,PHP生成HTML静态页面实例代码
  3. Programming Computer Vision with Python (学习笔记九)
  4. 机器视觉:图像与视频朝向检测
  5. 浅析java中的语法糖
  6. 事务457——事务的七个传播行为
  7. 分布式事务之最终一致的Mq实现
  8. Xftp使用教程——问答方式
  9. 浅谈JVM的实现与垃圾回收机制
  10. 聚类算法KMeans和KMedoid 的Matlab实现