微软HoloLens技术解谜

HoloLens 是什么?

HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素:

  • 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的图像与真实的世界相叠加。类似的产品有图像投射到视网膜上的 Google Glass,以及叠加在手机摄像头画面上的手机 AR 应用。
  • 它拥有是独立的计算单元,自带 CPU + GPU +HPU,不需要外接计算机。它的 CPU 和 GPU 基于英特尔的 14纳米工艺的 Cherry Trail 芯片,HPU 是微软发明的缩写,全称是 Holographic Processing Unit,即全息处理单元。按照知乎匿名用户的回答,HPU 是一块 ASIC(Application-specific integrated circuit),是微软为 HoloLens定制的集成电路,对此,我只能说“有钱任性”。

HoloLens 不是什么?

看完微软栩栩如生的宣传视频后,如果你的反应是

卧槽,Matrix 要来了。

那么你要好好看这一段,因为 Matrix 是 Virtual Reality / VR / 虚拟现实,VR 的特点是让参与者置身于计算机生成的三维图像世界中,淡化真实的世界。VR 近期的代表产品是 Oculus Rift,戴上 Rift 后你是看不到真实世界的。在我看来 VR 最大的问题是:这个虚拟世界很真实很精彩,但是有什么用呢?也就是说 VR 只能做到更逼真的三维世界,它无法帮助人们更好地理解真实的世界。

HoloLens 也不是 Google Glass(以下简称 GG),它比 GG 多了:

  • 三维感知能力,可以对身边的三维场景进行建模。而 GG 只能看到 RGB 像素值。
  • 三维渲染能力。
  • 人机交互能力,可以用手势来进行控制。

HoloLens 也不是市场上常见的的 AR,常见的基于摄像头的 AR 应用基于摄像头有:
基于丑陋的黑白标记图片的 AR

以及基于任意图片的 AR。

很炫是吗,但是它们只能检测到图片所在的那个平面。HoloLens 比它们都牛,它能检测到各个角度的三维场景!

HoloLens 的 AR 是如何得到三维场景深度信息的?

我们回到 AR 的定义,想要实现增强现实,必须先理解现实,那么对于 HoloLens 而言现实是什么呢?是传感器的数据。

传感器是啥?是摄像头。

同样是摄像头,为什么 HoloLens 就可以感知深度呢?微软的 Kinect 在这方面很成功,那么是不是 HoloLens 上放了一台嵌入式的 Kinect 呢?

答案在下面的原型图片中:

HoloLens 拥有有四台摄像头,左右两边各两台。通过对这四台摄像头的实时画面进行分析,HoloLens 可覆盖的水平视角和垂直视角都达到 120 度。

也就是说它采用的是立体视觉 / Stereo Vision 技术来获取类似下图的深度图 (depth map)。

立体视觉是计算机视觉学科的一个子学科,专注于从两个摄像头的图像数据中得到真实场景中的物体离摄像头的距离。示意图如下:

下面是基本的步骤,查阅 OpenCV 文档可以了解具体到函数用法 :

  • 摄像头校正,undistortion。由于摄像头的镜片出厂时都存在扭曲,为了得到精确的数据需要在使用前进行较正。常用的方法是基于棋盘的各个姿态拍几次,然后计算相机的矩阵参赛。下图便是常见的标定界面。

  • 图像对齐,rectification。因为两个摄像头的位置不同,因此它们各自看到的场景是有偏差的,左边的摄像头能看到最左的场景,右边的看到最右的场景。图像对齐的目的是得到相同的场景部分。
  • 左右图像匹配,correspondence。可以使用 OpenCV ,得到 disparity map。
  • 通过重映射函数,比如 OpenCV 中的 cv::reprojectImageTo3D,得到一张深度图。

只有一张深度图是不够的,它只是某一时刻真实的场景在摄像头中的映射。要想得到完整的三维场景,我们需要分析一系列的深度图。

HoloLens 如何从多张深度图重建三维场景?

答案是 SLAM,Simultaneous Localization And Mapping,即同步定位与建图系统。这个技术被用于机器人、无人汽车、无人飞行器的定位与寻路系统。解决的是非常哲学的问题:

  • 我现在在哪里?
  • 我可以去哪里?

SLAM 有很多实现的方式,有一个开源的方式,实现了很多深度图的处理和匹配算法,可以认为是三维版本的 OpenCV。

而微软围绕着 Kinect 的深度图数据发明了 Kinect Fushion 算法,并发表了两篇论文:

  • KinectFusion: Real-time 3D Reconstruction 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 都是怎么制作的?

读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?”

先介绍下背景知识,市面上常见的有三种类型的深度传感器:

  • 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的。说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩。
  • TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One,有点混乱是吧?
  • 双目摄像头,代表产品是 Google Tango 以及 Leap Motion,前者配有四台摄像头,后者有两个。

我认为 HoloLens 没有使用 TOF 技术的原因是因为如果这四个摄像头的位置放的是 TOF 传感器,那么还缺少一个朝前的 RGB 摄像头用于视频聊天类 App。读者提到的中间部分我认为是微型的投影仪,HoloLens 使用微投在“挡风玻璃”上显示全息的画面。参见 Wired 的这篇报道http://www.wired.com/2015/01/microsoft-nadella/

至于这个问题的标准答案,还得等微软发布新的信息。

读者提问之“HoloLens 能不能当 VR 用?

这个问题很好,的确可以这么玩,NASA 与微软的的火星合作计划基本上是一个虚拟现实的应用,它无视了真实的环境。如果 HoloLens 可以提供调节“挡风玻璃”透光度的 API,那么调成完全不透光时就好比戴着 Oculus Rift 的头盔,是另一种体验 VR 的途径。可是朋友们,这是在浪费 HoloLens 的机能啊!

那么,作为未来的应用开发者,应该怎样充分榨干它的机能呢?这是本篇文章的重点。

正文部分

首先让我脑洞开一会,为大家“介绍”下 Holo SDK。按照微软的偏好,SDK 标配的语言肯定有 C++ 和 C#,因此要进行开发,这两门语言你至少得会一门。

然后,这个 SDK 里有哪些功能呢?根据官方 demo 中的场景,我觉得基本功能至少有:

  • (a) 摄像头看到的图像,即当前场景的 color buffer。
  • (b) 当前场景的深度图,depth map 或 z buffer。
  • (c) SLAM 合成后的三维场景,这个场景所在的空间下文我们暂且称为 Holo Space,它可能是以乐高方块的形式表示,也可能是用三角形来表示。
  • (d) HoloLens 设备在 Holo Space 中的坐标 (x, y, z)、朝向 (tx, ty, tz)。
  • (e) 手势识别的结果,类似 HRESULT OnGestureDetected(DWORD dwHandId, DWORD dwEventId, LPVOID lpUserInfo) 的样子。
  • (f) 语音识别的结果,类似 HRESULT OnVoiceRecognized(std::string& strSentence, FLOAT confidence) 的样子。同样的,根据官方 demo,我将 HoloLens 应用分为三种:
  • 伪全息的传统应用

  • 针对 HoloLens 特别优化过的应用

  • 沉浸式的真-全息游戏

这一篇只讲“伪全息的传统应用”

这种类型的应用对于传统开发者而言最容易上手,几乎不需要修改代码,自然也不需要拥有 3D 图形学的知识。大部分人会从这种应用入手开始 Holo 开发。

如果不需要 3D 知识就能实现 3D 的界面,那么 3D 的效果是哪来的呢?那就是 Windows 10 引入的全息窗口管理器 —— explorer3d.exe。我们平时启动 Windows 看到的“桌面”是窗口管理器(explorer.exe)的一部分,把“桌面”想像成三维的就行了,很简单是吧?

一点都不简单!

以视频播放器为例,播放器并不会直接将视频画面显示到桌面上,而是画到一个缓存区域,经过一系列我不知道的步骤后,explorer.exe 再将画面以“2D 的方式拷贝”到能被我们看到的地方。而 explorer3d.exe 用的是“3D 的方式”。

所谓“3D 的方式”就是使用 Direct3D 做一些“会的人嫌我讲得啰嗦,不会的人看了还是不会”的事……

也就是在初始化应用的时候:

  • 创建一个 3D 的矩形来表示 3D 的窗口,保存在顶点缓存 vertex bufer(可以认为是放在显卡上的数组)
  • 创建一个贴图 texture(可以认为是放在显卡上的图片)
  • 创建表示窗口平移、旋转、拉伸值的 local_matrix(这里的 matrix 是数学中的矩阵概念,不是电影名称)

在应用运行时:

  • 如果需要在 Holo Space 中移动窗口,那么修改 local_matrix 中的平移值,功能与 explorer.exe 中的移动窗口类似,只是除了上下(y 轴方向)左右(x 轴方向)移动外还可以前后(z 轴方向)移动。
  • 如果需要在 Holo Space 中旋转窗口,那么修改 local_matrix 中的旋转值。explorer.exe 中没有类似的功能。
  • 如果需要在 Holo Space 中放缩,那么修改 local_matrix 中的放缩值,功能与 explorer.exe 中按住窗口边缘拖拉改变大小一致。
  • 如果视频内容需要更新,那么更新 texture 为最新的内容,只有这么做我们才能看到会动的视频。

在应用退出时:

  • 释放 Direct3D 的资源

不用担心,这些都是 explorer3d.exe 会负责的。

细心的读者会发现我们没有用到一个很重要的功能:

(d) HoloLens 设备在 Holo Space 中的坐标 (x, y, z)、朝向 (tx, ty, tz)。

要解释它我必须讲解 world、view、projection 三个矩阵,还要讲解矩阵的乘法以及 dot product 的公式等等,这些完全是图形学的知识了,一时半会讲不完,我会再专门为它们写一个系列。我打算用一句话解释下,explorer3d.exe 会维护一个全局的 global_matrix,它等于 world * view * projection,view 的值由功能 (d) 中的信息可以得到。global_matrix 的作用就好比第一人称射击游戏中的鼠标,写到这里我发现把 explorer3d.exe 视作一个 3D 游戏会简单很多,3D 游戏场景里的电视机也能播放视频,其实是一样的道理。

总结一下,这个类型的应用程序员几乎不需要修改代码,由 explorer3d.exe 负责调用 Direct3D 将传统应用的内容转换成 3D 的贴图。

时间: 2024-11-25 09:39:29

微软HoloLens技术解谜的相关文章

Microsoft HoloLens 技术解谜(下)

读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的.说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩. TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One,有点混乱是吧? 双目摄像头,代表产品是 G

Microsoft HoloLens 技术解谜(上)

HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的图像与真实的世界相叠加.类似的产品有图像投射到视网膜上的 Google Glass,以及叠加在手机摄像头画面上的手机 AR 应用. 它拥有是独立的计算单元,自带 CPU + GPU + HPU,不需要外接计算机.它的 CPU 和 GPU 基于英特尔的 14 纳米工艺的 Cherry Trail 芯片

微软Hololens设备 浅分析

微软Hololens的定位是一款MR 设备(Mixed reality).MR与AR的不同我认为是MR能够将真实环境的场景信息与虚拟对象进行完美的融合,它是基于SLAM(SimultaneousLocalization and Mapping)实时定位和场景建模的技术,使得设备能够识别周围环境,并且准确知道用户在场景中的位置,增强了用户使用的真实感. Hololens本身设备是一台头戴式的计算机,其配备一个半透明/分辨率极高的See-Through屏幕,整个设备集成了所有的零件,具体的详细配置见

【整理】一个真实的图灵:如迷的解谜者,并非万事成谜

据说,每一个码农都愿意为他默默撅起臀部,所以后来程序员都自称为IT基佬.阅读了<图灵传>,观看了<模仿游戏>电影,不免对图灵的一生有了一个了解,一个真实的图灵是怎么样子的呢?我整理了一些网上的资料并总结了一下,并非我个人原创,现在就和各位园友share一下: 1.关于电影<模仿游戏> 电影<模仿游戏>引进的有点“晚”了.这部电影在2014年获得了奥斯卡奖中的最佳改编剧本奖,可直到2015年夏天才正式引进到国内.这么一部数学家艾伦·图灵的传记片,铁杆影迷恐怕已

【Hololens】微软Hololens虚拟现实视频集

混合虚拟现实(Hololens眼镜) 微软还是混合虚拟现实的行业领导者,Hololens眼镜在很多行业有了令人印象深刻的应用和演示.譬如: Hololens中文宣传片: https://pan.baidu.com/s/1jHRcD0M Hololens展现无限可能(中文) https://pan.baidu.com/s/1hsoNnEG Hololens用于零售行业的演示 https://pan.baidu.com/s/1i4CR9fn 蒂森克努伯电梯使用微软Hololens用于电梯维修视频:

微软开放技术(中国)携 CKAN 和 OData 技术引入基于 Azure 的开放数据平台

今天,微软开放技术(中国)通过微软公有云Azure引入一个全新的开放数据平台,该平台基于开源数据门户解决方案 CKAN,以及由微软开放技术(中国)特别针对中国市场优化的ODATA插件来增强其国际化和本地化能力.此基于高性能云平台的开放数据解决方案,充分利用了中国软件开发市场上重要的技术方案,使得开源社区的开发者能轻易地访问流行的开放数据源. 全新的ODATA插件助力CKAN落地中国 10月21日,微软开放技术(中国)通过GitHub向CKAN的OData插件提交的代码已经被正式接受.我们此次的贡

微软Hololens遭遇失败,前途何在?

(如需转载,请注明本博客地址:龚老师的博客:http://www.cnblogs.com/SpencerGong) Intel最近宣布,用于微软的HoloLens设备中的"全息处理单元"(HPU)--Atome x5-Z8100P处理器,最后的下单时间为9月30日,出货截止时间为10月30日,之后就完全停产.微软Hololens遭遇失败,前途何在? 图1 Hololens零件图 有消息称,微软凭借在该领域的优势,跳过HoloLens 2.0而直接开发HoloLens 3.0,发布时间可

[深圳/广州]微软SQL技术沙龙分享会(MVP)

[深圳/广州] 新一期俱乐部活动报名开始,这次是广深地区SQL Server 技术沙龙分享会(MVP),SQL Server作为一个数据平台,不管是SQL Server 2017 on Linux 还是把一门开源R语言融入其最赚钱的旗舰商业数据库,微软已经决定,下一代的由云驱动的计算将以数据驱动的智能为特征,不管是平台.应用还是设备.微软对开源的拥抱现在已经是一个事实,而不是一个问题.微软现在已经认识到,开源平台是真正的行业标准,并且,喜欢产品的消费者会支持这些平台.微软已经有了HD Insig

20150204,微软七月安全补丁提前通知 微软全球技术支持中心安全技术部

作为微软每月补丁发布的一部分,微软会在补丁发布前一周向用户提供有关补丁的相关信息,包括补丁数量.受影响软件和严重等级等.此通知的目的是希望能够更好地帮助用户安排补丁部署计划. 在2014年7月9日,Microsoft 计划发布6个安全公告,以下是其简介: 新的安全公告 公告 ID 最高严重等级 漏洞影响 重新启动要求 受影响的软件 补丁1 严重 远程执行代码 需要重新启动 Microsoft Windows, Internet Explorer 补丁2 严重 远程执行代码 可能要求重新启动 Mi