在上一篇中,我们读到了UTAH于2015年的讲座的课件(的第一篇), 这次接着的第二篇会着重介绍图像编码在结构光方案中的应用(课件是2013年的)。 之所以要引入图像编码,很大程度上是为了提升扫描速度。之前在介绍实时渲染的时候,曾介绍过“实时”这个概念——简单的说,指的是在符合要求的时间内完成一帧的渲染,达到视觉上连续的结果。
与之类比,本篇读到后面也会介绍三维扫描的“实时”问题。相对上次介绍的至少需要10秒左右完成一次的扫描来说,要达到“实时”所需的响应时间窗口就小很多——如何通过纹样和图像编解码的方式来减少扫描时间,并达成实时目标也是本篇会读到的主要内容。
由于没有课件文稿,因此PPT部分以翻译为主,打星号的部分是我的个人理解或补充。其中的一些数学知识我也是首次接触,如有理解错漏也欢迎指正。
*部分页可能有排版略微错乱的问题,是原PDF文件就存在问题。
*这部分相对上篇来说,设备的设置基本没变,只是投射(和解析)的内容变为了一个纹样。
*其中的部分思路和之前介绍的立体视觉部分也有重合。
移动投影设备;
或是同时投射多个光带——但需要图像编(解)码。
*大部分概念后面都会涉及到,这里不急展开。另外,本文中codification一词就统一译作“编撰”,来和编码做区分,但也要理解它们在英文上有一定的同源性。
一个纹样在被投射到一个表面后就被编码了,一组观察到的区域投射可以被简单地与原始纹样匹配。例如:有着两条竖线的编码纹样。
将图像中的一片区域与它对应的纹样区域相匹配的过程就被称为纹样解码——类似对应点查找问题。
解码投影的纹样使得我们能快速找到一个大片的对应点集合——基于前置的在光纹样方面的知识(例如光纹样的唯一性设计)。
通常有两种编码对应点的方式:单轴或双轴编撰——它决定了三角测量时的计算方式。
*单轴时,三角测量是通过计算线与平面相交(如图);而双轴时是计算线与线相交(如图)。
解码纹样意味着在摄影图像上定位已知的投影纹样的对应点。
*这类技术的核心思想是持续投射一定时间(但会远小于单条光带扫描的时间),同时纹样之间可能还有一定的组合辅助以提高唯一性确认的速度——例如引入相位移的纹样投影。
*随着时间分配的光带有着唯一的光照编码(样式、排列)。
*如图所示,光带在时空上的值被以0或1的位平面栈来表示(并唯一标识)了。
通常只有两个光照级别被采用,并分别编码为0和1。
格雷码(Gray code)可以用于提升可靠性(相邻光带必须只能有1位有差别)。
每一个编码的点都能被它接收到的光强度值序列来(唯一)识别出。
要编码2的n次方的光带,就需要投射n个(符合时空规律的)纹样。
易于分割图像纹样,但需要投射很大数量的纹样。
*这里举一个简单的格雷码例子——例如自然数系列0-10,其格雷码是: 0000、 0001、 0011、 0010、 0110、 0111、 0101、 0100、 1100、 1101、 1111。从中可以理解“相邻只能有1位有差别”的意义。
*它能减少二进制编码中,部分进位需要使数字电路产生很大的尖峰电流脉冲会导致的一些混淆、不及时、不准确等问题;同时它也兼顾了相邻容错的特性。
*图中进一步在三维空间展示了这种时空编码与之前发射接收设备的对应关系。按上面的例子就需要投射并接受4次。
*上方示意图依次是:一根光带的标准光分割;一根光带的顶视图;使用结构光(编码)的光分割。
光纹样中,单独的光平面被以一定的(时间上的)编码组合进行索引:
一组纹样被成功投影到测量表面,而一个给定像素的代码文由一组纹样的序列构成。
最常用的纹样结构是一排随着时间变宽的光带——单轴编码。
高分辨率——能覆盖很多3D点位
高精度(微米级别)
对于颜色丰富的物体有着可靠性
*这里图中以三个光带为例,展示了其中格雷码的应用。也是“相邻只有1位差别”。
掠过平面扫描使用射线与平面交点来还原3D深度。
使用一个数据投射器来替代手动扫过激光或阴影平面。
如何建立投影平面与摄像机图像像素的对应关系?
解决方案:投影一个空间与时间上编码过的图像序列。
那么,具体要投影什么样的图像序列?
*这里第二句是重点,即原本是一次投射一根激光来定位(所谓的手动扫过),采用图像编码的方式就替代了“扫”的过程,即投射器本身不需要移动(变成了投射“数据”),只是变成了投射序列纹样,而靠这个纹样的时间空间编码来产生定位逻辑。
与二进制图像序列需要的图象数相同,但时间中有着更好的性能表现。
*由于格雷码自身的可靠性优势,需要的图像数量也能有所减少——其自身就带有一定的误差校正功能。
1984年由Inokuchi提出的结构光3D重建方案中:
*这里的颜色是一种(空间行列的)调试信息输出,不是这个方案中会使用颜色投影。方案本身还是基于格雷码的。
*图中展示了youtube上一段比较古老的视频演示,其中扫描的是真人的头部。有兴趣的可以依据链接进行观看。 格雷码:逐像素阈值、光带数量解码(后面与线位移一致)。
线位移:归一化、卷积、中心探测、标记、中心线交点、图像空间X和Y坐标。
*后面几页的课件个人觉得前后关系编写得比较迷惑,其实只需要理解是把一个“时间上位移的纹样”叠加到格雷码上,以提升编解码速度。
*例如:三个二进制纹样将物体分为8个区域;没有这些二进制纹样就无法区分投射的窄带;每一个窄带始终落在同样的区域中。
(a) 一张线位移序列的图片
(b) 计算后的范围图(z分量)
(c) 表面的渲染结果
其中的洞是由于一些点没有通过一致性检测而被剔除的,例如——由于过饱和的像素。
*这里指因为物体空间上的结构导致部分光信息(太暗)失效了,例如左图中暗处、右边两图白色挖空的部分。
投射一组纹样
投射sin函数
在相邻的光平面之间插值
对摄像机图像中像素对应的光带获取其次像素级精度
*从图中可以看到,光纹样窄带从01码的明暗分明变成类似“渐变”的效果(sin值);而只需要投影三个纹样的原因后面会解析。
Ibase是环境光强度,Ivar为投射器的光强度,Φ是相位主值。
*通过求相位差展开,绿色的部分通过相减消除了Ibase的影响,蓝色部分通过相处消除了Ivar的影响。
*摘录一段半角函数的推导:tan(θ/2)=sin(θ/2)/ cos(θ/2)= [2sin(θ/2)cos(θ/2) ] /2cos(θ/2)² = sinθ/(1+cosθ) = (1-cosθ)/sinθ
*其中已知Cosθ = 2Cos²(θ/2) - 1,Cosθ = 1 - 2Sin²(θ/2)。更多相关的推导可以自行搜索。
*最终相位角Φ(在0,2Π范围的解)可以写成如图的arctan的形式,只与θ和三个观测位置I的值有关。
在光强度中的有一定间隔的相位角
从立体三角测量(或光带)中得到间隔数
立体匹配变得容易——只有N种可能性
*图中红色部分可以理解为“整间隔”的数量,绿色部分则是一个间隔内的(相位移)偏移值。
*总的来说,这一节介绍的这些方法都是在基础格雷码上叠加纹样,以尽量少的分时间的纹样数量来确认对应关系的唯一性。
*直接编撰的意思就是能通过一次投影(或额外几次补充投影)就建立唯一的对应关系——颜色编码是典型的直接编撰方式。
有着m个符号的字母系统能编码m的n次方数量的光带。例如3个基于4灰度级别的N元编码的纹样,可以编码64根光带。
在编码中增加颜色也是为了增加编码维度。这在同样的数据长度内给我们提供了更多(编码)语言选择。
如果一个场景变化了为其投影的光的颜色,那么信息有可能会丢失。
在解码时,反射率限制(中性场景颜色)需要被充分考虑。
每一个编码的点都能通过它的颜色被(唯一)区分出来。
*其中左侧的Tajima彩虹纹样是通过白光透过水晶棱镜来产生的。
每个编码的像素能被其自身的强度、颜色属性(唯一)确定。
由于编撰过程通常被压缩到一个唯一的纹样中,它使用的强度、颜色光谱会非常大。
需要投射额外的参照纹样以辅助区分——环境光(黑色纹样)、全照明(白色纹样)。
*颜色光谱响应的问题,其中一个理解方向可以参考之前对于颜色空间的解读——即接收和识别不同频率的光波,其精度和准确性是不同的;因此虽然视觉上看着是连续的,但是识别起来并不是简单线性的,因此对设备提出了要求。
*这类方案在直接编撰的基础上不满足于像素级的唯一对应,而尝试以局部纹样的唯一性来检测窗口化的对应关系,以进一步提升扫描速度。
*注意这里是指图像区域的空间相关对应,而不是这个词直译的另一个光学上的概念。
(这种编码方式)对于复杂的外观也能有效。
需要很少的图像数(1或者2)。
但需要复杂得多的对应关系算法。
有着n个字母信号数的m阶德布鲁金序列(伪随机序列),是一个长度为n的m次方的字符串,且每个m长度的字串唯一出现一次(此时可以把窗口变为1维)。
图中的例子,m=4,n=2,得到的长度为16。
德布鲁金序列被用来定义颜色窄带(单轴编撰)或格子纹样(双轴编撰)。(*这里使用的颜色数量就可以类比字母信号数)
为了解码某一个颜色窄带,只需要确定它属于哪一个窗口即可——这也能解决问题。
*图中下方左侧的Zhang方案:用125条窄带编码——有着8种颜色,窗口尺寸为3条窄带。
*图中下方右侧的Salvi方案:29X29的各自——有着3种颜色,窗口尺寸为3条窄带,编码横向和纵向。
一个M阵列是一个二维展开的德布鲁金序列。
每一个窗口中一个wXh单元的元素只出现一次。
窗口的尺寸和M阵列的尺寸及其使用的符号数相关。
*图中例子:二元M阵列,尺寸4X6,窗口尺寸2X2。下面的图片则是不同定义方式的M阵列。
*图中展示了这种编码上的局部唯一性在查找对应时的应用。
可靠性——(易于)解决对应问题
快速——瞬时记录,实时处理
Kinect设备的结构光方案组合了两项传统的计算机视觉技术:基于焦点的深度测量、基于立体视觉的深度测量。
*它的深度图是基于解析红外激光投射的斑点纹样来得出。
推断身体位置是一个两步的过程:首先计算一个深度图(中间的灰度图),之后推断身体的位置(右边的“火柴”图,研究过AI生图的ControlNet的肯定不陌生)
投射某种空间纹样,其中一组相邻点在纹样中只出现一次。这样一个点位在编码语言中的标识就可以通过计算相邻点(的组合)来获得。
编撰过程被压缩到一个唯一的纹样,而不是时分复用的很多纹样。
相邻点尺寸(窗口尺寸)和需要编码的点的数量成正比,和使用的颜色数成反比。
这类技术的目标是获得一次拍摄就能测量的系统——可用于测量运动物体。
可以支持运动物体。
压缩编撰过程至一个纹样的可能性。
时分复用:高分辨率、高精度、易于实现;无法处理运动物体,需要很多纹样。
空间编撰:可以测量动态物体、只需要唯一的纹样;相对时分复用分辨率较低,需要更复杂的解码阶段,存在遮挡问题。
直接编撰:高分辨率、需要很少的纹样;对图像噪声比较敏感,也无法处理运动物体。
高精度、高分辨率、静态物体、纹样数量不限制——相位移+格雷码;Guhring的线位移方案。
高精度、高分辨率、静态物体、最少纹样数量——N元纹样+Horn&Kiryati Caspi的方案。
高精度、较好的分辨率、运动物体——德布鲁金纹样+Zhang的方案。
实际上这篇课件的编排上存在一些让人疑惑的点,虽然知识点主体是清楚的,但也常有配图和配文感觉不是很好的部分。对其中一些关键概念感兴趣的,可以去网上搜索一些更详细的资料。
总的来说,这个第二篇介绍的内容核心思想就是——设计一种能唯一识别空间中像素点的方式,再在此基础上做三角测量以还原该位置的深度(单轴或双轴方式)。
在时分复用方法中,最终一个像素能得出唯一的一串0和1组成的二元序列,或是引入相位移后的0-1之间的值(所谓的次像素级);在直接编撰方案中,会尝试以例如灰度、颜色之类的像素唯一标识来区分像素;在空间编撰方案中,还试图以窗口子集来一次确认一组像素,以达到实时性的要求。
其中提到和玩家有关联的Kinect也已经是很多年以前的产物了,现在的AR和VR技术肯定更先进、更高效,但至少这种基于结构光来识别空间的思路我们得以窥见其中的奥秘了。
评论区
共 1 条评论热门最新