3D-camera结构光原理算法
目前主流的深度探测技术是结构光,TOF,和双目。具体的百度就有很详细的信息。编程
而结构光也有双目结构光和散斑结构光等,没错,Iphone X 的3D深度相机就用 散斑结构光。安全
我用结构光模块作过实验,主要考虑有效工做距离,精度和视场角是否知足需求。性能
本文对结构光(Structured Light)技术作一个比较全面的简介。网站
结构光三维成像的硬件主要由相机和投射器组成,结构光就是经过投射器投射到被测物体表面的主动结构信息,如激光条纹、格雷码、正弦条纹等;而后,经过单个或多个相机拍摄被测表面即得结构光图像;最后,基于三角测量原理通过图像三维解析计算从而实现三维重建。ui
利用红外相机像素点信息求解被测物体深度信息须要通过:机构光解码、像素、空间坐标转换;为了知足获取深度信息的实时性,结构光模块内部通常会有一枚专用的处理芯片,用于计算并输出实时信息。编码
3D结构光目前的使用场景为:spa
第一,物体信息分割与识别,3D人脸识别,用于安全验证、金融支付等场景; 3d
第二,体感手势识别,为智能终端提供新的交互方式;code
第三,三维场景重建,利用深度相机生成的深度信息(点云数据),结合RGB彩色图像信息,可完成对三维场景的还原,可用于测距,虚拟装修等场景。
基于结构光的三维成像,其实是三维参数的测量与重现,主要是区别于纯粹的像双目立体视觉之类的被动三维测量技术,于是被称为主动三维测量。由于他须要主动去投射结构光到被测物体上,经过结构光的变形(或者飞行时间等)来肯定被测物的尺寸参数,所以才叫作主动三维测量,嗯,至关主动。
首先,结构光的类型就分为不少种,既然是结构光,固然是将光结构化,简单的结构化包括点结构光,线结构光以及简单的面结构光等。复杂一点的结构化就上升到光学图案的编码了。结构光投射到待测物表面后被待测物的高度调制,被调制的结构光经摄像系统采集,传送至计算机内分析计算后可得出被测物的三维面形数据。其中调制方式可分为时间调制与空间调制两大类。时间调制方法中最经常使用的是飞行时间法,该方法记录了光脉冲在空间的飞行时间,经过飞行时间解算待测物的面形信息;空间调制方法为结构光场的相位、光强等性质被待测物的高度调制后都会产生变化,根据读取这些性质的变化就可得出待测物的面形信息。
下面以一种应用普遍的光栅投影技术(条纹投影技术)为例来阐述其具体原理。条纹投影技术实际上属于广义上的面结构光。其主要原理以下图所示, 即经过计算机编程产生正弦条纹,将该正弦条纹经过投影设备投影至被测物,利用CCD相机拍摄条纹受物体调制的弯曲程度,解调该弯曲条纹获得相位,再将相位转化为全场的高度。固然其中相当重要的一点就是系统的标定,包括系统几何参数的标定和CCD相机以及投影设备的内部参数标定,不然极可能产生偏差或者偏差耦合。由于系统外部参数不标定则不可能由相位计算出正确的高度信息。
整体而言,结构光主要能够分为两类
1. 线扫描结构光;
2. 面阵结构光。
通常说结构光的时候都指代第二类,这里也主要关注面阵结构光。
1. 线扫描结构光
线扫描结构光较之面阵结构光较为简单,精度也比较高,在工业中普遍用于物体体积测量、三维成像等领域。
1.1 数学基础
先来看一个简单的二维下的状况:
经过上图能够看到线扫描结构光装置的一个基本结构。主动光源L缓慢扫过待测物体,在此过程当中,相机记录对应的扫描过程,最后,依据相机和光源在该过程当中的相对位姿和相机内参等参数,就能够重建出待测物体的三维结构。
由上图可知:
可得
其中, α 为投影装置的朝向。 β 则须要经过对应像素的像素坐标 μ和焦距f来肯定。最终可知P点的三维坐标为:
将之推广至三维空间中
:
由小孔成像模型有
由三角测量原理又有
两式联立则有
最后可得
能够看到,三维空间中的情形和以前的二维空间相似,做为俯仰角的 γ并无出如今公式中。
1.2 应用
如上图,相机与投影器等相对位姿都通过了精确的校订,而且选取了测量台上的一角做为原点创建物方坐标系。所以,激光投影器所投射的线激光在物方坐标系中能够经过一个平面方程来描述:
而相机光心的位姿经过几何校订也已知,能够经过找到线激光在图像中的对应像素重建出光心与像素的射线,射线和激光平面的交点即为待求的三维空间点。由小孔成像模型有
代入平面方程中,可得
2. 面阵结构光
面阵结构光大体能够分为两类:随机结构光和编码结构光。随机结构光较为简单,也更加经常使用。经过投影器向被测空间中投射亮度不均和随机分布的点状结构光,经过双目相机成像,所得的双目影像通过极线校订后再进行双目稠密匹配,便可重建出对应的深度图。以下图为某种面阵的红外结构光。
随机结构光这里就再也不说了,由于和普通双目算法是很类似的。一些额外的考虑就是是否给相机加装滤光片、光斑的密度要到什么程度等硬件和光学的问题了。这里主要讨论编码结构光。编码结构光能够分为两类:
1. 时序编码;
2. 空间编码。
2.1 时序编码
如上图,时序编码结构光即为在必定时间范围内,经过投影器向被测空间投射一系列明暗不一样的结构光,每次投影都经过相机进行成像。假设共有n张影像,并设被阴影覆盖的部分编码值为1,未被覆盖的部分编码值为0。此时,每一个像素都对应惟一一个长度为n的二进制编码,双目影像搜索匹配像素的问题就变成了查找具备相同编码值的像素。若是双目图像已经进行了极线校订,那么所投影的结构光只须要在x方向上不具备重复性便可。
如上图中,红框内的像素的编码为0110,转化为十进制则为5。此时,只须要在右图相同行上检索编码值为5的像素便可。上图编码方式称为二进制码(binary code),每段区域不断的进行二分下去直至投影的编码宽度等于相机的像素宽度便可。对于宽度为1024的图像,最少须要10张影像来进行编码。
Binary Code 的一种改进为Gray Code. Gray Code比Binary Code具备更好的鲁棒性,它使得相邻两个像素相差1bit。Gray Code的详细介绍和其与Binary Code之间的转换能够参考wikipedia。
注意观察便可看到gray code和binary code在前几行像素上的不一样
转换算法:
天然,除了使用二进制的0-1编码以外,还可使用更多颜色层级的编码。假设使用了M种不一样的灰度层级进行编码,则拍摄N张影像能够获得包含
个条带的影响。以下图中M = 3, N = 3时图中有27条条带。
由以上的介绍也能够得出时序编码结构光的优缺点:优势:
· 高精度;
缺点:
· 只适用于静态场景;
· 须要拍摄大量影像。
2.2 空间编码
为知足动态场景的须要,能够采用空间编码结构光。前面谈到了随机结构光,就是不带编码信息,投影随机纹理,而这里讨论的空间编码结构光特指向被测空间中投影通过数学编码的、必定范围内的光斑不具有重复性的结构光。由此,某个点的编码值能够经过其临域得到。其中,包含一个完整的空间编码的像素数量(窗口大小)就决定了重建的精度。
2.2.1 德布鲁因序列 (De Bruijn) 序列
德布鲁因序列(维基百科)B(k, n) 表示用k个符号(如二进制,k = 2)来表示长度为
的循环编码,n为一个编码值的长度。举例:最简单的,k = 2时,采用二进制符号(0, 1),编码值的长度n = 2,能够获得一个长度为
的循环序列:[0, 0, 1, 1]。此时,咱们获得4个长度为2的不一样的编码:[0, 0], [0, 1], [1, 1], [1, 0].所以,某种结构光就能够按照该德布鲁因序列进行编码。而得到的结构光影像中,以上4个像素的编码为[0, 0, 1, 1],经过一个大小为2的滑动窗口(假定一个结构光光斑或光束的宽度是一个像素)便可获取每一个像素的编码值。一样地,若是是通过极线校订的双目图像,只须要搜索对应的行便可,此时只要求编码在x轴上不具有重复性。此时的结构光就是竖直条带状的。固然,为了提升编码效率,也可使用灰度图、彩色图像等比0-1编码具备更多可能编码值的投影方式。例如,对于RGB影像,采用二进制编码(即某种颜色只有 有、无 两种状态),则共有
种颜色组合,去除(0, 0, 0),还剩下7种颜色。所以k = 7, n = 3,这样就能够得到一个长度为343的条带序列。对于这个序列,惟一的约束为:相邻的条带不能为一样的颜色。不然对于解码算法来讲很容易形成偏差。下图展现了只使用5种颜色(k = 5, n = 3)的结构光序列:
2.2.2 二维空间编码
德布鲁因序列是一种一维编码,能够将之扩展到二维空间中,使得对于一个x * y大小的二维空间,其中一个w * h大小的子窗口所包含的编码值在这整个二维编码序列中只出现一次。
如上面中的4 * 6的M-arrays序列中,每一个2 * 2大小的窗口所包含的编码值都是惟一的。一样也能够利用RGB信息来进行二维编码,有相关算法来产生一些伪随机二维编码。如在下图中,左边展现了一个6 * 6大小的二维矩阵,子窗口的大小为3 * 3。算法首先在左上角的3 * 3子窗口中随机填入各类颜色;而后一个3 * 1大小的滑动窗口移动到右端第一个空白处,并随机填入3中颜色;在填入生成的随机颜色前,算法会先验证子窗口的编码的惟一性能不能获得保证,若不能,则会从新生成3中随机颜色;如此循环,只是在竖直方向上滑动窗口的大小变为1 * 3,直至将整个6 * 6矩阵填满。右图则是该算法产生的某种伪随机二维编码的示例。
经过以上对空间编码的讨论,也能够看出空间编码结构光的一些优缺点:优势:
· 无需多张照片,只须要一对影像便可进行三维重建。能够知足实时处理,用在动态环境中。
缺点
· 易受噪声干扰:因为反光、照明等缘由可能致使成像时部分区域等编码信息缺失;
· 对于空间中的遮挡比较敏感;
· 相较于时序编码结构光精度较低。
以上是对各类经常使用的结构光技术的一些介绍。其实,三维重建中最经常使用的仍是随机面阵结构光。经过向空间中投影这样的随机结构光,再结合双目稠密重建,能够得到比单纯使用RGB影像进行三维重建更加可靠和精确的结果。最后,向对结构光和三维重建感兴趣的同窗推荐一个项目:build your own 3D scanner。和名字同样,网站上提供了本身使用触手可及和低成本的设备来DIY一个3D扫描仪所需的一切,包括教程、ppt、代码、数据和其余人的做品展现,感兴趣的同窗欢迎动手尝试。