微软HoloLens技术解谜

2023-10-14 08:30
文章标签 技术 微软 hololens 解谜

本文主要是介绍微软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 的这篇报道

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

读者提问之“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 的贴图。

转载于:https://www.cnblogs.com/zoucaitou/p/4257683.html

这篇关于微软HoloLens技术解谜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209325

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

微软正式推出 Spartan 斯巴达浏览器

作为用于替代 IE 浏览器的下一代继任者,微软的 Project Spartan 斯巴达浏览器可算是吊足了玩家们的胃口!如今,在最新的 Windows 10 Build 10049 版本起,它终于正式登场了。 斯巴达浏览器搭载了全新的渲染引擎、新的用户界面并集成了 Cortana 语音助手。功能上新增了稍后阅读列表、阅读视图、F12开发者工具、支持网页注释 (手写涂鸦),可以保存到 O

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m