适合初学者的SLAM实践教程(1):相机模型-如何从照片中重建出像素点的三维坐标?

推荐开源项目:简单的SLAM与机器人教程与编程实践-github

三维重建到底是怎么回事?已知什么数据?待求解哪些变量?

看下面这张图,一图解释如何根据照片进行三维重建。首先,三维重建就是根据把照片的像素点对应现实世界中某个点在相机坐标系下的三维坐标计算出来。一般我们可以通过深度相机或者双目视觉等方式获取目标物体离相机坐标系原点的距离ZrealZ_{real},这里的相机坐标系的原点就是相机的焦点
所以现在我们已经知道了的数据有:“像素点A在照片坐标系中的位置(ximg,yimg)(x_{img},y_{img})”、“照片离相机坐标原点的距离,即焦距ff”、“像素点A对应现实世界中那个点离相机的距离zrealz_{real}”。
我们需要根据上面这些信息求出:现实世界那个点在相机坐标系下的三维坐标(xreal,yreal,zreal)(x_{real},y_{real},z_{real})。所以现在待求解的未知量xrealx_{real}yrealy_{real}

在这里插入图片描述

如何根据像素点的位置,和真实物体离相机的距离来还原真实物体在相机坐标系中的坐标?

从上图很容易看出来我们可以利用相似三角形来根据f,zreal,ximg,yimgf,z_{real},x_{img},y_{img}这些已知量,来求xrealx_{real}yrealy_{real}
根据相似三角形我们知道这几条边的放缩比例是相等的,即有:zrealf=xrealximg=yrealyimg\frac{z_{real}}{f}=\frac{x_{real}}{x_{img}}=\frac{y_{real}}{y_{img}}
所以可以得到:
xreal=zrealf×ximgyreal=zrealf×yimgx_{real}=\frac{z_{real}}{f}\times x_{img} \\ y_{real}=\frac{z_{real}}{f}\times y_{img}
ximg,yimgx_{img},y_{img}是可以根据像素算出来,zrealz_{real}要么可以用雷达或者红外或者双目视觉计算出。所以我们已经计算出照片中位于(ximg,yimg)(x_{img},y_{img})这个点的相对于相机坐标系下的三维坐标(xreal,yreal,zreal)(x_{real},y_{real},z_{real})了。

练习:从实例中学习如何根据照片进行三维重建

举个例子:
现在已知一个照片的某个像素坐标为(1mm,3mm),焦距为15mm, 并且通过传感器测量到该像素对应的现实世界中的那个点A离相机焦点的距离是30cm。现在想求A点相对于相机坐标系下的的坐标。(注意本例子中的坐标系如下图所示)
在这里插入图片描述
现在已知角距f=15f=15毫米。照片中A对应的那个像素点的坐标为(1,3)单位是毫米。真实世界中A点离相机坐标系原点距离为zreal=300z_{real}=300毫米。
所以有A点相对于相机坐标系中的另外两个维度的坐标
xreal==zrealf×ximg=20×1=20yreal=zrealf×yimg=20×3=60x_{real}==\frac{z_{real}}{f}\times x_{img} =20\times1=20\\ y_{real}=\frac{z_{real}}{f}\times y_{img}=20\times3=60
所以我们就讲照片中的一个像素点还原成三维坐标(20,60,300)(20,60,300)了,单位是毫米。

posted @ 2019-09-24 16:50  varyshare|李韬  阅读(2827)  评论(1编辑  收藏  举报