微软 HoloLens 技术解谜(上)?
作者张静是前微软上海Xbox ATG软件工程师。
HoloLens 是什么?
HoloLens是微软发布的一款可穿戴增强现实计算设备。它有几个关键要素:
它是一种增强现实产品,即增强现实(AR)。AR技术将计算机生成的图像与现实世界叠加在一起。类似的产品还有谷歌眼镜,将图像投射到视网膜上,手机的ar应用叠加在手机摄像头的屏幕上。它有一个独立的计算单元,有自己的中央处理器图形处理器HPU,不需要外部计算机。它的中央处理器和图形处理器基于英特尔14纳米工艺的樱桃轨迹芯片,HPU是微软发明的缩写,微软的全称是全息处理单元。根据知乎匿名用户的回答,HPU是一个ASIC(专用集成电路),是微软为HoloLens定制的集成电路。只能说是有钱任性。HoloLens 不是什么?
看完微软生动的宣传视频,如果你的反应是:
妈的,矩阵来了。
那你要仔细看这一段,因为Matrix是虚拟现实/VR/Virtual Reality,而VR的特点是将参与者暴露在计算机生成的3D图像世界中,稀释现实世界。VR最近的代表产品是Oculus Rift,穿上Rift之后就看不到真实的世界了。在我看来,VR最大的问题是这个虚拟世界非常真实和精彩,但是有什么用呢?也就是说,VR只能实现更逼真的三维世界,无法帮助人们更好地理解现实世界。
HoloLens不是谷歌眼镜(以下简称GG),它不止GG:
三维感知,可以对周围的三维场景进行建模。GG只能看到RGB像素值。三维渲染能力。人机交互能力,可以通过手势控制。全息镜头也不是市场上常见的AR。基于相机的常见增强现实应用包括:
AR基于丑陋的黑白标记图片。
以及基于任意图片的AR。
很酷,不是吗?但是他们只能探测到图片所在的平面。HoloLens比他们强,它可以从各个角度检测3D场景!
HoloLens 的 AR 是如何得到三维场景深度信息的?
回到AR的定义,要实现增强现实,首先要了解现实,那么对于HoloLens来说什么是现实呢?这是传感器数据。
什么是传感器?它是一个照相机。
它也是一台照相机。HoloLens为什么能感知深度?微软的Kinect在这方面非常成功,那么HoloLens上有嵌入式的Kinect吗?
答案在下面的原型图中:
HoloLens有四个摄像头,两个在左边,两个在右边。通过分析这四个摄像头的实时图像,HoloLens覆盖的水平和垂直视角可以达到120度。
也就是说,它采用立体视觉/立体视觉技术,获得类似下图的深度图。
立体视觉是计算机视觉的一个分支学科,其重点是从两台摄像机的图像数据中获取真实场景中物体与摄像机之间的距离。示意图如下:
以下是基本步骤。查阅OpenCV文档,了解具体的函数用法:
相机校准,无扭曲。由于相机的镜头在出厂时会发生畸变,所以在使用前需要对其进行对准,才能得到准确的数据。常见的方法是根据棋盘的每一个姿势拍几次,然后计算相机的矩阵进入比赛。下图是常见的校准界面。图像对齐,校正。因为两个摄像头的位置不同,所以看到的场景也不同。左边的摄像头可以看到最左边的场景,右边的摄像头可以看到最右边的场景。图像对齐的目的是获得相同的场景部分。左右图像匹配,对应。OpenCV可以用来获取视差图。通过重映射函数得到深度图,比如OpenCV中的cv:reprojectImageTo3D。只有一张深度图是不够的,它只是摄像机中真实场景在某一时刻的映射。为了获得完整的3D场景,我们需要分析一系列深度图。
HoloLens 如何从多张深度图重建三维场景?
答案是SLAM,同步定位测图,也就是同步定位测图系统。该技术用于机器人、无人驾驶车辆和无人机的定位和寻路系统。为了解决一个非常哲学的问题:
我现在在哪里?我能去哪里?实现SLAM的方法很多,有一种开源的方式,实现了很多深度图处理和匹配算法。SLAM可以看作是OpenCV的立体开发者_如何转开发版。
微软围绕Kinect深度图数据发明了Kinect Fushion算法,并发表了两篇论文:
Kinect融合:实时三维重建
n and Interaction Using a Moving Depth Camera;KinectFusion: Real-Time Dense Surface Mapping and Tracking。为什么我认为 HoloLens 与 Kinect Fushion 有关?答案在这个页面中 。 Shahram Izadi 是微软剑桥研究院的 principal researcher 及 research manager。他所领导的互动 3D 技术组 / interactive 3D technologies 为微软的多项产品提供了研究力量,包括 Kinect for Windows, Kinect Fusion 以及 HoloLens。顺便说一句,他们组在招人:)
Kinect Fushion,通过在室内移动 Kinect 设备,获取不同角度的深度图,实时迭代,对不同对深度图进行累积,计算出精确的房间以及房间内物体的三维模型。
它分四个阶段:
深度图格式转换,转化后的深度的单位是米,用浮点数保存。并计算顶点坐标和表面的法向量。计算世界坐标系下的相机姿态(包含位置和朝向),通过迭代的对齐算法跟踪这两个值,这样系统总是知道当前的相机与最初的姿态相比变了多少。第三阶段将姿态已知情况下的深度数据融合到单个三维乐高空间里,你也可以叫它为MineCraft 空间,因为这个空间的基本元素不是三角形,而是方格子。演示视频中频频出现MineCraft 场景估计也和这个阶段有关。基于 Raycasting 的三维渲染,Raycasting 需要从当前的相机位置发出射线,与三维空间求交集。乐高空间特别适合Raycasting,可以用八叉树来加速射线的求交运算。Raycasting、Raytracing 以及 Rasterization 是三种常见的渲染方式,这里就不展开了。在 HoloLens 的应用中我们运行到第三步,即获取三维乐高模型就可以了,第四步并不是必需的。因为 HoloLens 的屏幕是透明的,不需要再把房屋的模型渲染一遍,我们自带的眼睛已经渲染了一遍了:)
HoloLens 炫酷的 demo 都是怎么制作的?
还剩下三个难点,留待后续文章叙说:
手势识别怎么做的?眼球跟踪怎么做的?非常贴合的三维渲染是怎么做的?
精彩评论