本篇博客为转载,我对其中的细节添加了一些说明。
原文链接:https://blog.csdn.net/chentravelling/article/details/53558096

0.前言

最近整理了“相机成像原理”和“视差与深度信息”相关的资料,然后做成了PPT,以备自己用,也提供给相关的图像、视觉方向的朋友参考。如有误,望海涵并指出。

1.正文

图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:
zhz注:根据右手定则,下面的相机坐标系和世界坐标系的Y轴方向都反了,因为拇指指向X正方向,食指指向Y轴正方向,那么Z轴的正方向就是中指指向。下面的相机坐标系和世界坐标系都是左手坐标系。
构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。
接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。

1.1世界坐标系与相机坐标系

于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:

那么从世界坐标系到相机坐标系的转换关系如下所示:

1.2相机坐标系与图像坐标系

从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。

  • p(x,y)是图像坐标系上的点(即相机坐标系上的点投影到图像坐标系的投影点),o是图像坐标系的中点,也是相机的焦点,f是相机的焦距。
  • 相机的成像平面 就是 图像坐标系所在平面(二维平面)。
  • P(Xc,Yc,Zc)是相机坐标系上的点,Oc是相机的光心。

此时投影点p(x,y)的单位还是mm,并不是pixel,需要进一步转换到像素坐标系。

1.3图像坐标系与像素坐标系

像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫主点(principal point)

图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。

所以这二者之间的转换如下:其中dxdy表示每一列和每一行分别代表多少mm,即1pixel=dx mm。就是说,
dx就是在水平方向上1个像素的长度(单位mm);
dy就是在竖直方向上1个像素的长度(单位mm)。

p(x,y)是图像坐标系上的点,O(u0,v0)是图像坐标系的中心点,u0,v0对应像素坐标系的u0pixelv0pixel,并非mm,如果像素平面的分辨率为W*H (单位pixel), 那么
u0=1/2∗Wv0=1/2∗Hu_0=1/2*W \\ v_0=1/2*Hu0​=1/2∗Wv0​=1/2∗H

注意p(x,y)x,y是从图像坐标系中心点开始的偏移,单位是mm,所以:

  • x/dx是从p(x,y)到图像坐标系中心点的横向偏移;
  • y/dy是从p(x,y)到图像坐标系中心点的纵向偏移;
  • u0,v0为像素坐标系的中心点(不是原点,原点在左上角),等于图片像素的宽和高的一半;
  • 图像坐标系 x,y和像素坐标系u,v的量纲单位不一样,x,ymm, u,vpixel

一个点从相机坐标系投影到图像坐标系的点P(x,y),此时单位还是mm,点p(x,y)的坐标值x,y表示的是距离图像中心点,也是图像坐标系原点的距离(mm)。
由于图像坐标系和像素坐标系就是同一个平面,只是原点不一样。所以点P(x,y)在像素坐标系的坐标就变成了:
u=xdx+u0v=ydy+v0u=\frac{x}{d_x} +u_0 \\ \quad \\ v=\frac{y}{d_y}+v_0u=dx​x​+u0​v=dy​y​+v0​

计算p(x,y)投影到像素坐标系上的值:

那么通过上面四个坐标系的转换就可以得到世界坐标系中的一个点P(Xw,Yw,Zw)如何投影到像素坐标系中的一个点p(u,v)

前两个矩阵相乘,令fx=f/dx,fy=f/dy,得到的就是上图中标出的相机内参矩阵。其中,fxfy也叫等效焦距。
相机的内参和外参可以通过张正友标定获取(戳这里查看张正友标定的资料)。

相机内参矩阵K是一个3x3的上三角矩阵。

刚学的小伙伴们可能会有疑问了:为什么上面要把相机内参写成3x4矩阵形式,相机外参写成4x4的形式?
答:是因为在进行代码编程时,并不会使用(R*P+t)这种求法,而且求相反的变换时,涉及到求变换矩阵的逆,而求逆必须是对方阵求逆。所以这里要多加一行[0⃗1∗3,1][ \vec{0}_{1*3},1][01∗3​,1]。
对于内参矩阵有变成3x4,这里可不必纠结,因为当需要求逆时,我们会把旋转矩阵和平移向量写成齐次矩阵。我们注意看的话,会发现,上面的相机内参3x4其实只有2x3是有效的,其他的都是填充的,并且,里面的3x3已经是齐次了。他这里把相机内参矩阵扩展成3x4只是为了使等式维度吻合,才写成了3x4。实际编程中,只需要把相机内参矩阵取3x3的齐次矩阵,然后再与坐标点进行运算即可。

分析一下这几个空间变换:

如果把物点在相机坐标系下所在的平面叫做物平面。为了描述方便,我们这里以点(XC,YC,ZC)(X_C,Y_C,Z_C)(XC​,YC​,ZC​)来描述物平面。那么从物平面(XC,YC,ZC)(X_C,Y_C,Z_C)(XC​,YC​,ZC​)除以ZcZ_cZc​变成归一化平面(XC/ZC,YC/ZC,1)(X_C/Z_C,Y_C/Z_C,1)(XC​/ZC​,YC​/ZC​,1)。

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

[xy1]=[f000f0001][Xc/ZCYc/Zc1]\begin{bmatrix} x\\y\\1 \end{bmatrix} =\begin{bmatrix} f&0&0\\0&f&0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} ⎣⎡​xy1​⎦⎤​=⎣⎡​f00​0f0​001​⎦⎤​⎣⎡​Xc​/ZC​Yc​/Zc​1​⎦⎤​
这里不是fxf_xfx​和fyf_yfy​,因为这里是相机坐标系到图像坐标系,单位还是mm,并没有变到像素坐标系中。变到像素坐标系中才需要fff除以dxd_xdx​和dyd_ydy​后变成fxf_xfx​和fyf_yfy​.


归一化平面(XCZC,YCZC,1)(\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1)(ZC​XC​​,ZC​YC​​,1)乘以焦距fff变为成像平面(x,y)(x,y)(x,y)。

成像平面(x,y)(x,y)(x,y),把长度m和像素直接进行缩放变化,并平移中心点到左上角,就变成像素平面(u,v)(u,v)(u,v)。

或者直接由归一化平面(XCZC,YCZC,1)(\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1)(ZC​XC​​,ZC​YC​​,1)乘以相机内参矩阵K,变为像素平面,一步到位。

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

[uv1]=[f/dx0u00f/dyv0001][Xc/ZCYc/Zc1]=[fx0u00fyv0001][Xc/ZCYc/Zc1]\begin{bmatrix} u\\v\\1 \end{bmatrix} =\begin{bmatrix} f/dx&0&u_0\\0&f/dy&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} =\begin{bmatrix} f_x&0&u_0\\0&f_y&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} ⎣⎡​uv1​⎦⎤​=⎣⎡​f/dx00​0f/dy0​u0​v0​1​⎦⎤​⎣⎡​Xc​/ZC​Yc​/Zc​1​⎦⎤​=⎣⎡​fx​00​0fy​0​u0​v0​1​⎦⎤​⎣⎡​Xc​/ZC​Yc​/Zc​1​⎦⎤​


Zc值求解:\color{red}Z_c值求解:Zc​值求解:

关于ZcZ_cZc​值求解,可参考这篇博客:像素坐标转到世界坐标时相机坐标系中的Zc值求解,其中 R为旋转矩阵,K为相机内参矩阵,T为平移向量,均为已知值。ZcZ_cZc​是世界坐标系的某点P(Xw,Yw,Zw)P(X_w,Y_w,Z_w)P(Xw​,Yw​,Zw​)投影到相机坐标系的点的ZZZ方向坐标,该博客主要内容如下截图:

对于每个像素(u,v)(u,v)(u,v),都有一个对应的ZcZ_cZc​,所以,并不是对整张图的像素来说,只有一个ZcZ_cZc​。
当我们需要从2D像素点反投影到3D世界坐标系时,只需要知道像素坐标相机内参相机外参(即:相机到世界坐标系的旋转矩阵平移矩阵),就可以求得这个像素对应的深度ZcZ_cZc​,进而可以通过前面的公式:


得到该像素对应的三维世界坐标系点。我们在自动驾驶开发项目中,一般会把世界坐标系设定为车身坐标系。对于地面上的车道线等,由于我们知道车身坐标系的原点离地面的高度,就知道了车身坐标系下的ZwZ_wZw​,进而可以得到深度信息ZcZ_cZc​,从而得到图像中车道线的该像素对应的三维车身坐标系点。

不过,对于高度未知的,就不能求出ZcZ_cZc​了。

所以,通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的ZcZ_cZc​的值。
关于三维重建不是我的方向,但是深度值的获取是我项目中的一个需要解决的问题,这将涉及到后面的立体视觉知识。


上面的公式中省略了去畸变的步骤,该步骤是在使用相机内参矩阵进行变换前,在相机外参矩阵*世界坐标系,得到相机坐标系点(Xc,Yc,Zc),将其取前两维度除以【Zc】得到二维点(Xc/Zc,Yc/Zc),见下面公式:

把公式左右两边都除以Zc,然后进行去畸变运算,得到去畸变后的二维点(x,y),再将去畸变的二维点(x,y)经过【相机内参矩阵】计算,得到最终的像素点坐标(u,v),即

【PPT下载】

地址:http://download.csdn.net/detail/chentravelling/9833120

原文评论截图:



【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换相关推荐

  1. 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chentravelling/article/details/53558096 0.前言 最近整理了& ...

  2. 图像成像原理与相机标定

    一.图像成像原理 世界坐标系到相机坐标系 世界坐标系是空间中根据需求任意指定的坐标系,相机坐标系是以镜头为原点,光心方向为Z轴方向的坐标系. 同一个点在不同坐标系下的坐标可以通过平移旋转的仿射变换得到 ...

  3. 【立体视觉(一)】之成像原理与相机畸变

    [立体视觉(一)]之成像原理与相机畸变 一.成像原理 一)针孔模型 二)坐标系转换 1. 世界坐标系到相机坐标系 2. 相机坐标系到图像坐标系 3. 图像坐标系到像素坐标系 4. 相机坐标系到像素坐标 ...

  4. 【camera】2.相机成像原理和数学模型

    相机模型中的坐标系: Ow-xyx:世界坐标系,物体位置,单位:m Oc-xyz:相机坐标系,光心为原点,单位:m Oi-xy:图像坐标系,光心为图像中心,单位:mm Op-xy:像素坐标系,原点为图 ...

  5. 【图像处理】相机成像原理

    这里对于相机成像原理做一个简单的介绍. 如下图所示,在最左端的顶点为相机,它的镜头正对着地面上的点O,横向视场角为a,纵向视场角为θ,它所看到的区域就是就是如下所示的四边形,存在一定的投影变换. 而地 ...

  6. 相机投影原理、相机模型中的坐标系统以及标定方法(转载)

    文章目录 0 引言 1 相机投影中的坐标系及其转换关系 1.1 世界坐标系与相机坐标系 1.2 相机坐标系与图像坐标系:称为摄像机模型以及投影矩阵 1.3 图像坐标系与像素坐标系 1.4 从世界坐标系 ...

  7. 相机成像模型、相机内参、外参、以及相机标定

    看了一圈各个平台讲解相机模型.相机标定的文章,很多只是简单罗列几个公式,其中的细节都没说明,本着学习的出发点写下这篇文章,希望能给初学者解惑.本文主要讲解相机模型,一步步推导从世界坐标系到图像坐标系的 ...

  8. 九七的视觉工程 | 普通单目相机成像过程及相机内参详解

    相机成像过程及相机内参详解 一.定义介绍   本节以小孔成像模型为例,详细介绍了普通单目相机的成像过程,相机内参及内参矩阵的详细含义.本节所述的成像原理与大部分相机成像原理类似,读懂此节可满足大部分与 ...

  9. 2022最新!自动驾驶、计算机视觉和AI公司汇总

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 秋招 ...

最新文章

  1. python-pptx
  2. 使用Xcode和Instruments调试解决iOS内存泄露(转)
  3. 在Qt调用OpenCV库编写GUI程序
  4. “混”的中层们,你们的下一站是?
  5. 数据库性能优化的误区!
  6. 【Java】jdk和eclipse下载安装
  7. Eclipse 编写代码自动提示设置
  8. Ubuntu16.04下codeblocks16.01安装,适用于不同的架构
  9. Facebook广告营销的6个方法经验分享
  10. Tensorflow:variable变量和变量空间
  11. Echarts-地图扩展-标准geoJson格式扩展地图-例子
  12. 干货收藏|如何用chrom插件实现U校园自动刷课
  13. FireMonkey v1.1的WinSoft WinRT-10.3-SEO-狼术
  14. 零成本建立医学数据库之实践
  15. go语言实现简单的在线词典
  16. 深度学习用于医学预后-第二课第四周1-4节-使用线性和基于树的模型构建风险评估模型
  17. 2022年国内外主流的10款Bug跟踪管理软件
  18. 软件缺陷及其生命周期
  19. 果实可采摘点论文汇总
  20. c语言中100的阶乘问题,还有没有人在算100的阶乘的?

热门文章

  1. 现代前端开发路线图:从零开始,一步步成为前端工程师
  2. Full Gc经历分析
  3. 【编程语言】JAVA | Windows10下JAVA的环境配置(绝对路径)
  4. jvm性能调优实战 - 29使用 jstat 摸清线上系统的JVM运行状况
  5. MyBatis-05 MyBatis XML方式之update/delete元素
  6. Spring-AOP @AspectJ切点函数之within()
  7. 学习笔记(十五)——MySQL(查询)
  8. hashmap 判断key是否存在
  9. linux图形模式切换用户,Linux的图形模式和文本模式以及单用户模式切换
  10. java更新 位置_请求位置信息更新  |  Android 开发者  |  Android Developers