一文详解结构光发展简史
来源:许翔翔的学习笔记 https://zhuanlan.zhihu.com/p/29971801
作者:许翔翔@知乎(已授权)
编辑:3D视觉开发者社区
■ 背景知识
针孔相机模型:射线方程
我们把数码相机简化成针孔相机模型,光心为 点,传感器面为红色实线, 点到传感器面距离 。那么我们可以这样描述成像的过程:三维空间中的 点经过光心 点在传感器面上成像为 点,且 、 、 三点在一条直线上。针孔相机模型是一个三维空间( 点所在空间)到二维面( 点所在面)的变换, 线上的任意一点(如 、 、 )所成的像都是 点,因此如果只知道 点,我们是无法反推出具体哪一个 点点亮了 点,我们只能说点亮 点的点一定在射线 上。所以针孔相机模型本质上是射线方程,也就是说知道了CCD上的点,就可以得到一条射线。
为了方便描述,我们之后将把针孔模型对称翻转过来,如上图虚线所示,从数学的角度,它们是等价的。
针孔相机双目确定物点模型:射线相交得到点
为了确定到底是哪一个 点点亮了相机0上的 点,我们引入了另一个相机,通过相机1,我们可以得到 点在相机1中的像点 ,联立 和 我们就可以唯一的得到空间中 点,上图表达了这个关系。
■ 被动测距
双目测距:匹配特征
图中上部左右两幅照片是两个标定好的相机对同一个场景拍摄并对准后的,图中下部是上图场景中的高度分布,颜色越深离相机越远。
我们把上面的场景抽象成草图,举例而言,显示器在相机0和相机1中不同的像位置是确定显示器空间所在位置的关键,那么为什么高度分布是块状的?
这是因为由于拍摄的场景缺少特征点,以下图为例,如果说左图中白色盒子顶上的四个点我们还可以在右图中找的到,那么图中红色点在右图我们就根本找不到对应的点。由于特征点的稀缺,双目测距中是不可能实现像素级点对点的匹配的。
■ 主动结构光
结构光:匹配拓扑网格
如果说特征点的缺失是双目测距的一大痛点,有学者就提出,既然缺少特征点不如我就造一些特征点出来,这就是结构光。iPhone X的人脸识别用的就是这一项技术。
iPhone X中有两个与此相关的传感器,分别是Infrared camera和Dot projector,前者是相机,而后者是一个点阵投影仪。从数学上说,一部分投影仪是可以用逆向针孔相机模型描述的,也就是说如果我知道投影面上的某一个点,我就可以知道由这个点投影出的一条射线,这条射线遇到一个面,线面相交的点就会被投影仪点亮。这里我们为什么说「一部分」投影仪可以等价于针孔相机,这个问题在后面会谈到。
为了确定这个线面相交的点的位置,我们用一个相机观察,如上图所示,我们可以在点阵投影仪的投影面上找到点亮 点的投影点,也可以在相机CCD面上找到被 点亮的成像点。上面的草图中,一共有五个投影点,而相机拍到的五个投影点,会因为面形的存在改变相邻两点之间的距离却不会因为面形的存在导致五个投影点相对顺序的改变,因此我们说相机是通过拓扑网格的标号来确定CCD面上点和投影仪投影面上点的一一对应关系。
在实际的应用当中,会根据待测面形的特点确定拓扑网格的结构。举例而言,对于iPhone X的结构光主要测量的人脸,因此它的结构光在设计过程中,加密了人脸中眼、鼻、口的光点数量,使得在人脸识别中更具有特征的眼、鼻、口的采样率更高,深度数据真实性更强。主动结构光拓扑网格匹配已经远远强于被动双目测距的特征匹配,但是即便如此依然无法实现像素级点对点的匹配,无法实现的原因我们会在下一节讲到。
主动投射结构光和被动双目测距相比既有好处也有坏处,好处是大大提高了测量准确度和分辨率,坏处则是需要有主动式投影光源。举个很显而易见的例子,由于投影光源在远距离的情况下就失效了,远距离的测距主要还是用被动双目测距的方法。当然远距离的测距还有很多别的更可行的方案,比如激光雷达,但是本文只讨论结构光体系内的技术。
结构光:匹配相位分布
我们为了测量的面形保真,必须尽可能的提高采样点的数量。上一节拓扑网格匹配结构光里采样点的提高有一个上限,那就是CCD必须可以区分采样点,否则在CCD中采样点糊成一团,也就失去了拓扑网格标号。因此这里有一对矛盾,一方面要尽可能的提高采样率,一方面又不能超过CCD的分辨能力。
上图中,测量面上最左边的点,相机却无法分辨最左边的点与和它相邻的点。为了解决这个问题,学者就提出采用相位的方法实现像素级点对点匹配。在前面的介绍中,被动双目测距用「特征点」作为「相机0——物——相机1」这个过程的传递不变量,主动拓扑网格结构光中,以「拓扑网格标号」作为「投影仪——物——相机」的传递不变量。在这里我们以相位分布 作为传递不变量。之所以用相位分布作为传递不变量,是因为相位分布是由面形的高度分布直接决定的。
以四步相移为例,上图右图是投影仪投出的X方向相移正弦条纹,左图是CCD拍摄到的由于面形引起的X方向变形条纹。对这两组图求包裹相位,并解包裹得到X方向相位分布情况。
举例而言,投影面和CCD的像素数都是512*512,对于投影面上的一个像素(下图右图红点),我能找到它的X方向相位值,根据这个相位值,能够找到CCD面上具有这个相位值的所有像素(下图左图红线),通过这个X方向相位值,能够把投影面上的点和CCD面上的线关联起来。
同样的道理,投影仪投影Y方向正弦条纹,我们就能够在CCD面上唯一确定与投影面上红点对应的像素,通过X方向相位和Y方向相位,我们找到了「投影面像素标号 CCD面像素标号」的对应关系,实现了像素级点对点匹配。
结构光:匹配编码
肯定有读者会问上面都已经实现了像素级点对点匹配,分辨率的提高都已经到头了,那么这项技术还可以怎么演进呢?这里我们就要谈一谈相移法的优缺点了,相移法是属于一种优点和缺点都极为显著的方法,优点是,通过相移解相位的方法,牺牲了时间(多幅条纹投影),以粗的条纹获得了细的分辨率,缺点是正弦条纹极易被干扰,这就导致了相位图失真,CCD像素和投影面像素的一一对应性被破坏。
因此,学者就提出,能不能把步子迈得小一点,我们不要求像相移法那样高的分辨率,但是CCD像素和投影面像素的一一对应性必须要保证。由此就提出了以编码作为传递不变量,确定像素的对应性。
以下图为例,我们对蓝色点进行编码,通过XY两个方向一共6幅由疏到密的二值条纹,我们能够得到一串表明蓝色点位置的6位编码「100101」,其中1代表在这一位上是白色,0代表黑色。编码位数越高越能准确的描述蓝色点的位置,当然位数越高同样意味着条纹越密,位数的上限取决与CCD能够分辨的最小二值条纹粗细。二值条纹的抗干扰能力显著高于正弦条纹。
下图是慕尼黑光博会上某个展商的装置,用一个投影仪一个相机以及编码图样实现了三维测量,实际上它所用的图样(编码位数)最后远远高于我截的这6幅图。
双目结构光:不能或者不想标定投影仪
还记得我们前面有一节讲到只有一部分投影仪可以用逆向针孔相机模型来描述,受限于投影仪的凸透镜成像法则,大多数情况下很难用一个通用的模型来描述投影仪整个群体,比如说,投影面放在投影仪透镜焦面上的准直投影就不能用逆向针孔相机模型来描述。
这意味这投影仪不能用射线方程来描述,也就意味着又要解决一个相机解欠定的问题,自然我们想到了再引入一个相机。
请注意,因为这里的投影仪不是射线模型,因此我也就不画成前文投影仪的样子了。
和前面的结构光匹配编码类似,只是我们现在匹配的是两台相机当中的编码而不是匹配投影仪和相机的编码。
交叉偏振结构光:解决反光问题
反光是所有结构光的大敌,包括被动双目测距,主动结构光扫描。因为反光会造成采集信号丢失,相当于双目测距失去一目,方程欠定有无穷多解。
所以结构光只能用在粗糙表面测量上,下图表明了两种表面反射光的形态。左图是粗糙表面反射光形态,粗糙表面会讲投影光线均匀的散开,只要有一支被CCD接受我们就可以确定投影像素和CCD像素的对应关系。右图是类镜面反射光形态,反射光中,光强最强的主瓣沿着反射定律确定的反射光方向,而旁瓣则在主瓣周围散开,越远离主瓣光强越弱。结构光无法处理反光就是因为CCD接收不到光线。类镜面反射光形态和粗糙表面反射光形态并不是一成不变的。一些材质的粗糙表面在某些角度的光线或者光强大于一定的值之后也会表现出类镜面反射光的特点。
为了解决这个问题,学者就提出投影交叉偏振结构光的方法。其原理是反射光是s占优的部分偏振光,只有当入射角是布鲁斯特角时,反射光是s线偏振光。根据这个原理,大量的含水面的风光摄影都用到了与s光正交的偏振镜来抵消s光以达到减弱反光的效果。
通过给投影仪加装偏振镜的方法,我们可以得到一对具有正交偏振方向的投影光,下图两个蓝色圈中的即是两个不同偏振方向的投影仪。
通过交叉偏振投影结构光的方法,总有一个方向能够极大的降低反光,再通过拍摄到无反光的结构光的相机的位置,可以按照前文所述得到三维信息。
Phase Measuring Profilometry:既不标定投影仪也不用双目
Phase Measuring Profilometry,中文名为:相位测量轮廓术。
前文的所有测量包括被动双目和主动结构光都属于绝对测量,这里的Phase Measuring Profilometry(PMP)是一种相对测量的手段。既不标定投影仪也不用双目,这势必意味着我们方程又回到了欠定无穷多解的问题上。好在相移干涉法给了一个思路,我们可以通过给一个绝对高度的参考面,测量的是与参考面的相对高度,由此得到待测面的绝对高度。
相机拍摄参考面的四步相移正弦图样,解包裹相位得到相位分布,如下下图右图。
相机拍摄待测面的四步相移正弦图样,解包裹相位得到相位分布,如下图左图。
PMP的核心在于标定「相位——高度」的映射:
其中, 是在 处待测面与参考面的高度差, 是对应的待测面相位分布和参考面相位分布的差, , 和 是标定系数。
、 、 需要采用别的手段进行标定。由于标定好「相位——高度」的映射,因此PMP不需要在另一个方向测量相位分布。为了解决PMP中方程欠定的问题,需要引入参考面和其他的标定手段,肯定有读者会问这相对于之前的结构光好在哪里呢?其实方法没有好坏之分只有适合用在哪里的区别。虽然PMP增加了标定和设备的复杂性,但是好在这些工作只要做一次就可以,非常适用于有基准面的测量,比如电路板的三维测量等等。
后PMP时代
后PMP主要朝着这么几个方向,动态测量,在线测量,提高算法性能和精度以及一些难测量面形的测量方案设计。
本文仅做学术分享,如有侵权,请联系删文。
下载1
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
下载2
在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。
下载3
在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
一文详解结构光发展简史相关推荐
- 超详细!一文详解容器网络发展
推荐大家关注一个公众号 点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Somethings,I don't ta ...
- 一文详解 | 低代码发展的 “背后推手”
近年来,随着数字经济的发展,越来越多企业迈入了数字化转型的行列,低代码平台因为其低门槛.高效率的特性,被许多企业认为是数字化转型的利器,因而得到了长足发展. 低代码市场快速发展,渐成百亿规模 Forr ...
- 一文详解 ChatGPT:背后的技术,数据,未来发展
文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链(Chain of Thought,COT) 基于人类反馈的强化 ...
- 一文详解自动驾驶的运行设计域(ODD)| 自动驾驶系列 1
一文详解自动驾驶的运行设计域(ODD)| \n 自动驾驶系列 2021年4月30日,SAE发布了第四版J3016<驾驶自动化分级>,这是即2014年1月16日.2016年9月30日.201 ...
- 一文详解 YOLO 2 与 YOLO 9000 目标检测系统
一文详解 YOLO 2 与 YOLO 9000 目标检测系统 from 雷锋网 雷锋网 AI 科技评论按:YOLO 是 Joseph Redmon 和 Ali Farhadi 等人于 2015 年提出 ...
- 一文详解决策树算法模型
AI有道 一个有情怀的公众号 上文我们主要介绍了Adaptive Boosting.AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的hypothesis乘以不 ...
- 一文详解Pandas
一文详解Pandas 一.Pandas概述 二.Pandas数据结构 2.1 Series 2.2 DataFrame数据结构 二.数学与统计计算 三.DataFrame的文件操作 3.1 读取文件 ...
- 一文详解自动驾驶的动态驾驶任务(DDT) | 自动驾驶系列
文章版权所有,未经授权请勿转载或使用 本系列上篇文章<一文详解自动驾驶的运行设计域(ODD)>解读了什么是自动驾驶ODD,本篇文章依据SAE J3016详细解读自动驾驶DDT.DDT fa ...
- yolov系列-yolov1-论文详解
yolov系列-yolov1-论文详解 @[TOC](yolov系列-yolov1-论文详解) yolov1相关资料 yolov1论文详解 算法原理 yolov1优缺点 yolov1相关资料 yolo ...
- asterisk配置文详解
asterisk配置文详解 Configuration GuideYou've installed Asterisk and verified that it will start up.Now ...
最新文章
- 打包、压缩、文件查找、通配符
- Lombok 的爱恨情仇
- C语言文件操作(三)读取指定路径txt文件,并输出文件内容
- 用commons-fileupload-1.2 实现文件上传
- HMM前向算法,维比特算法,后向算法,前向后向算法代码
- 西南大学0039c语言作业答案,2017年6月西南大学继续教育学院C语言0039大作业答案...
- 百度入股汽车照明模组晶合光电
- dev代码拷贝中文乱码的解决方案
- 【openv450-samples】像素点聚类EM 图像聚类目标检测
- 关于casewhen...的用法
- ESP8266/ESP32 +1.3“ or 0.96“ IIC OLED指针式时钟
- 转载:技术大停滞——范式春梦中的地球工业文明:前言
- flash加载图片 代码_消失的人:Flash中的图片加载器和随机链接应用
- 注意力机制如何助力GAN生成更高质量的图像?
- Centos7安装PostgreSQL 12.4 + postgis安装
- 四轴码垛机器人MDH模型运动学
- python二级证书含金量排名_计算机二级证书含金量有多高?你真的知道吗???...
- NetSuite中如何使用Workbook制作销售同比分析表
- 什么是MySQL数据库?应用环境有哪些?
- Leetcode—— 104. 二叉树的最大深度