激光三角法

非常感谢朱志浩师哥对激光三角法的详细讲解,使我获得了很多新知识。

三维重建的方法:单目、双目、光度立体等

激光三角法是单目+线结构光的方法

激光器发射出的是一个激光平面,也叫光刀面,激光平面照射到物体上就形成了一道线激光

整个仪器一边是相机,另一边是线激光器,线激光器将线结构光打在物体上,相机拍摄到线激光的画面,(右图)然后计算出激光线上的像素点的深度值,就能够恢复出物体的三维结构了。

相机标定->激光平面标定->三维重建

相机标定的目的就是获得相机内参矩阵和畸变参数等一系列参数,相机标定的方法很多,这里使用张正友标定法。

激光平面标定的目的:

获得激光平面在相机坐标系下的平面方程\(Ax+By+Cz+D=0\),从而可以获得图像线激光上像素点的深度

注意:平面方程是在相机坐标系下定义的,所以一旦激光平面标定完成之后,激光器和相机的相对位置就必须固定不动了。

左图就是从图像中提取激光线得到的光条中心线,每一张图片都能提取出一条激光线。三个不共线的点可以确定一个平面,所以我们最少可以使用2张激光线的图片,在激光线上提取3个点就可以得到激光平面方程,但这样做误差肯定很大。

所以这里用到了很多张图片,一条激光线代表一张图片,最终通过最小二乘法拟合得到一个平面,就是所要求的激光平面。

流程:相机标定\(\longrightarrow\)提取激光线\(\longrightarrow\)激光线上的点转化到相机坐标系\(\longrightarrow\)拟合激光平面

提取激光线:

方法:极值法、阈值法、灰度质心法

极值法:图像中的激光线是由一定的宽度的,而且激光线的中心亮度最大,激光线从中心到两侧边缘亮度逐渐减小,所以极值法就是寻找图像中每一行的最大值作为激光线的光条中心。

阈值法:首先设定一个阈值T,然后从图像的两侧向中间寻找灰度值为T的像素点A、B,最后取A、B的中心作为激光线的光条中心。

灰度质心法:用到了重心公式,把图像的灰度值当作质量,灰度值越大,也就是质量越大,找到图像中每一行的重心当作激光线的光条中心。

这三个方法其实都非常容易受到噪声的干扰,所以需要进一步的改进方法。

将激光线上的像素点的像素坐标转化到相机坐标系下是重点,因为最后需要激光平面的方程就是定义在相机坐标系下的,所以需要将刚才提取到的激光线像素坐标转化到相机坐标系下。

首先需要明确的是,在相机标定过程中定义的世界坐标系是以标定板所在的平面为\(z=0\)\(xoy\)平面)的平面,也就是说标定板平面在世界坐标系下的平面方程为\(z=0\),接下来需要求的是标定板平面在相机坐标系下的方程。

通过相机标定,我们能得到世界坐标系到相机坐标系的\(R,T\),这里的\(R\)\(T\)是从世界坐标系到相机坐标系的,求逆后得到相机坐标系到世界坐标系下的\(R,T\)

\[\begin{eqnarray} \left( \begin{matrix} x_w\\y_w\\z_w \end{matrix} \right) &=&R^{-1}\left( \begin{matrix} x_c\\y_c\\z_c \end{matrix} \right)+(-T)\\ &=&\left( \begin{matrix} r_{11} & r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33} \end{matrix} \right) \left( \begin{matrix} x_c\\y_c\\z_c \end{matrix} \right)+\left( \begin{matrix} t_x\\t_y\\t_z \end{matrix} \right)\\ &=&\left( \begin{matrix} r_{11}x_c+r_{12}y_c+r_{13}z_c+t_x\\ r_{21}x_c+r_{22}y_c+r_{23}z_c+t_y\\ r_{31}x_c+r_{32}y_c+r_{33}z_c+t_z \end{matrix} \right) \end{eqnarray} \]

将公式展开之后把第三行提取出来,由于标定板平面在世界坐标系下的方程为\(z_w=0\)

所以\(r_{31}x_c+r_{32}y_c+r_{33}z_c+t_z = 0\),把$ z_w=0$代入即为标定板在相机坐标系下的方程得到这个方程之后,我们就可以求出打在标定板平面上的激光线上的点在相机坐标系下的三维坐标了。

\[z_c \left( \begin{matrix} u\\v\\1 \end{matrix} \right) \overset{K}{\longrightarrow}\left( \begin{matrix} x_c\\y_c\\z_c \end{matrix} \right) \]

其中带\(u,v\)参数的两个方程,将方程里的\(x_c,y_c\)代入上式\(r_{31}x_c+r_{32}y_c+r_{33}z_c+t_z = 0\),即可求出\(z_c\)。(大概是这样,我没太听懂)

通过刚才求出的很多激光线上的点在相机坐标系下的三维坐标,通过最小二乘法拟合即可得到激光平面方程

以上相机标定和激光平面标定都是激光三角法的准备工作,接下来才正式进入三维重建的过程

对扫描拍摄到的图像进行三维重建,这个过程也分为三个步骤:

  1. 提取激光线,也就是之前提到的三个方法:极值法、阈值法、灰度质心法

  2. 根据标定得到的激光平面方程,可以求得激光线上的点在相机坐标系下的三维坐标,每一帧图像都可以得到一条激光线上的三维点坐标,但都是相机坐标系下的坐标,需要转化到世界坐标系下,所以需要进行多帧拼接,也就是把所有相机坐标系下求得的三维点转化到一个世界坐标系下。这里定义第一帧图像的相机坐标系定义为世界坐标系,接下来每一帧图像都需要变换到这个世界坐标系下,也就是求外参\(R,T\),这里需要根据仪器的不同求出不同的\(R,T\)

    以旋转扫描为例,在仪器运转过程中相机只会发生旋转运动,所以只需要求旋转矩阵\(R\)即可,根据相机坐标系的定义,\(z\)轴指向镜头的前方,\(y\)轴指向镜头的上方,所以旋转扫描是围绕\(y\)轴旋转,对应的旋转矩阵\(R\)就是这样的

  3. 最终将所有相机坐标系下的三维点都变换到世界坐标系下,得到的所有三维点坐标就是重建物体的三维模型

posted @ 2020-09-03 15:43  码我疯狂的码  阅读(2928)  评论(0编辑  收藏  举报