论文部分内容阅读
2015年1月22日,微软Windows 10发布会,Windows 10最新预览版的到来没有激起观者的太多兴趣,反而是一个新家伙抢了整个发布会的风头,它是HoloLens,微软最新的“黑科技”。
你一定会期待苹果每年的发布会,是吧?谷歌I/O大会应该也能吸引不少人的眼球,甚至小米发布会的吸引力也不小,而微软的发布会在这两年移动互联浪潮下就显得不那么让人期待和兴奋了。但年初Windows 10发布会却收获了观众久违的欢呼和掌声,却不是因为Windows 10。HoloLens,微软发布的全息眼镜,拥有强大的计算能力,能将真实世界与虚拟三维空间合二为一。
HoloLens是什么?
简单来说,HoloLens是一款可穿戴式增强现实计算设备,它拥有几个关键要素:
●它是增强现实产品,即Augmented Reality(AR),AR技术将计算机生成的图像与真实世界叠加。类似的产品有图像投射到视网膜上的谷歌眼镜,以及叠加在手机摄像头画面上的手机AR应用。
●它拥有独立的计算单元,自带CPU、GPU和HPU,不需要外接任何设备。它的CPU和GPU是基于英特尔14nm工艺的Cherry Trail芯片,HPU则是微软发明的缩写,全称是Holographic Processing Unit,即全息处理单元。HPU是一块ASIC(Application-Specific Integrated Circuit),是微软为HoloLens定制的集成电路,不得不说,微软的这个举动真是“有钱任性”。
说到这里,你是不是想到了十多年前经典的科幻电影《黑客帝国》?里面的现实世界是由一个名叫“Matrix”的计算机人工智能系统控制,人们都活在虚拟世界当中。不过,HoloLens和Matrix可不一样。Matrix是虚拟现实(Virtual Reality,简称VR)。VR的特点是让参与者置身于计算机生成的三维图像世界中,淡化真实的世界。VR近期的代表产品是Oculus Rift,戴上Rift后你是看不到真实世界的。VR最大的问题是:这个虚拟世界很真实、很精彩,但是有什么用呢?也就是说VR只能做到更逼真的三维世界,它无法帮助人们更好地理解真实世界。
那么谷歌眼镜呢?HoloLems是不是和它更像。没错,但HoloLens不等于谷歌眼镜,它比后者多了这些:
●三维感知能力,可以对身边的三维场景进行建模。而谷歌眼镜只能看到RGB像素值。
●三维渲染能力。
●人机交互能力,HoloLens可以用手势进行控制。
其实AR离我们并不遥远,甚至很多人应该都接触过。常见的AR应用是基于摄像头的,包括了基于黑白标记图片的AR以及基于任意图片的AR,最近在朋友圈中很火的3D小熊就是基于AR的应用。但是这些应用只能检测到图片所在的那个平面。HoloLens比它们都牛,它能检测到各个角度的三维场景!
HoloLens背后的技术
简单地说明了HoloLens到底是怎样的一个产品,你是不是更好奇在HoloLens背后是哪些技术支撑起了这些酷炫的体验?下面我们就来一一解读。
如何得到三维场景深度信息
让我们回到AR的定义,想要实现增强现实,必须先理解现实,那么对于HoloLens而言现实是什么呢?是传感器的数据。HoloLens上的传感器是什么?是摄像头。同样是摄像头,为什么HoloLens就可以感知深度呢?微软Kinect在这方面很成功,那么是不是HoloLens上放了一台嵌入式的Kinect呢?答案自然在HoloLens中。从HoloLens的官方图片中我们可以看到它拥有四个摄像头,左右两边各两个。通过对这四个摄像头的实时画面进行分析,HoloLens可覆盖的水平视角和垂直视角都达到120°。也就是说它采用的是立体视觉技术(Stereo Vision)来获取事物的深度图(Depth Map)。立体视觉是计算机视觉学科的一个子学科,专注于从两个摄像头的图像数据中得到真实场景中物体离摄像头的距离。下面,我们来看看摄像头是如何获取深度图的(查阅OpenCV文档可以了解具体函数的用法,地址:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html),其基本步骤如下:
1、摄像头校正(Undistortion)。由于摄像头的镜片出厂时都存在扭曲,为了得到精确的数据需要在使用前进行校正。常用的方法是基于棋盘的各个姿态拍几次,然后计算相机的矩阵参数。
2、图像对齐(Rectification)。因为两个摄像头的位置不同,因此它们各自看到的场景是有偏差的,左边的摄像头能看到最左的场景,右边的看到最右的场景,图像对齐的目的是得到相同的场景部分。
3、左右图像匹配(Correspondence)。在OpenCV中可以使用StereoBM得到Disparity Map。
4、通过重映射函数,比如“cv::reprojectlmageTo3D”,得到一张深度图。
如何通过多张深度图重建三维场景?
只有一张深度图是不够的,它只是某一时刻真实场景在摄像头中的映射。要想得到完整的三维场景,我们需要分析一系列的深度图。而在获得多张深度图后,HoloLens将如何重建三维场景呢?答案是SLAM(Simultaneous Localization And Mapping),即同步定位与建图系统。这个技术被用于机器人、无人汽车、无人飞行器的定位与寻路系统。解决的是非常哲学的问题:
●我现在在哪里?
●我可以去哪里? SLAM有很多实现的方式,有一个开源的资料库(http://pointclouds.org)实现了很多深度图的处理和匹配算法,可以认为是三维版本的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应该有关,答案在这个页面中:http://research.microsoft.com/en-us/people/shahrami。Shahram Izadi是微软剑桥研究院的首席研究员(Principal Researcher)及研究主管(Research Manager)。他所领导的互动3D技术组(Interactive 3D Technologies)为微软的多项产品提供了研究力量,包括Kinect for Windows,Kinect Fusion以及HoloLens。
让我们来看看Kinect Fushion是如何通过多张深度图重建三维场景的,这会帮助我们了解HoloLens的技术原理。Kinect Fushion通过在室内移动Kinect设备,获取不同角度的深度图,实时迭代,对不同的深度图进行累积,计算出精确的房间以及房间内物体的三维模型。它分四个阶段:
1、深度图格式转换,转化后的深度单位是米,用浮点数保存,并计算顶点坐标和表面的法向量。
2、计算世界坐标系下的摄像头姿态(包含位置和朝向),通过迭代的对齐算法跟踪这两个值,这样系统总是知道当前的摄像头与最初的姿态相比变了多少。
3、将姿态已知情况下的深度数据融合到单个三维乐高空间里,你也可以叫它为MineCraft空间,因为这个空间的基本元素不是三角形,而是方格子。HoloLens演示视频中频频出现MineCraft场景估计也和这个阶段有关。
4、基于Raycasting的三维渲染,Raycasting需要从当前的相机位置发出射线,与三维空间求交集。乐高空间特别适合Raycasting,可以用八叉树来加速射线的求交运算。Raycasting、Raytracing以及Rasterization是三种常见的渲染方式,这里就不展开了。
在HoloLens的应用中其实只需要运行到第三步,即获取三维乐高模型就可以了,第四步并不是必需的。因为HoloLens的屏幕是透明的,不需要再把房屋的模型渲染一遍,我们自带的眼睛已经渲染了一遍了。
HoloLens的应用场景
那么,HoloLens到底能为我们带来怎样的应用呢?在谈这个问题前,有必要先对Holo SDK进行一个猜想:这个SDK里有哪些功能呢?根据官方Demo中的场景,基本功能至少有:
●摄像头看到的图像,即当前场景的Color Buffer。
●当前场景的深度图,Depth Map或z Buffer。
●SLAM合成后的三维场景,这个场景所在的空间我们暂且称为Holo Space,它可能是以乐高方块的形式表示,也可能是用三角形来表示。
●HoloLens设备在Holo Space中的坐标(x,y,z)、朝向(tx,ty,tz)。
●手势识别的结果,类似HRESULT OnGestureDetected(DWORD dwHandld,DWORD dwEventld,LPVOID IpUserInfo)的样子。
●语音识别的结果,类似HRESULT OnVoiceRecognized(std::string
你一定会期待苹果每年的发布会,是吧?谷歌I/O大会应该也能吸引不少人的眼球,甚至小米发布会的吸引力也不小,而微软的发布会在这两年移动互联浪潮下就显得不那么让人期待和兴奋了。但年初Windows 10发布会却收获了观众久违的欢呼和掌声,却不是因为Windows 10。HoloLens,微软发布的全息眼镜,拥有强大的计算能力,能将真实世界与虚拟三维空间合二为一。
HoloLens是什么?
简单来说,HoloLens是一款可穿戴式增强现实计算设备,它拥有几个关键要素:
●它是增强现实产品,即Augmented Reality(AR),AR技术将计算机生成的图像与真实世界叠加。类似的产品有图像投射到视网膜上的谷歌眼镜,以及叠加在手机摄像头画面上的手机AR应用。
●它拥有独立的计算单元,自带CPU、GPU和HPU,不需要外接任何设备。它的CPU和GPU是基于英特尔14nm工艺的Cherry Trail芯片,HPU则是微软发明的缩写,全称是Holographic Processing Unit,即全息处理单元。HPU是一块ASIC(Application-Specific Integrated Circuit),是微软为HoloLens定制的集成电路,不得不说,微软的这个举动真是“有钱任性”。
说到这里,你是不是想到了十多年前经典的科幻电影《黑客帝国》?里面的现实世界是由一个名叫“Matrix”的计算机人工智能系统控制,人们都活在虚拟世界当中。不过,HoloLens和Matrix可不一样。Matrix是虚拟现实(Virtual Reality,简称VR)。VR的特点是让参与者置身于计算机生成的三维图像世界中,淡化真实的世界。VR近期的代表产品是Oculus Rift,戴上Rift后你是看不到真实世界的。VR最大的问题是:这个虚拟世界很真实、很精彩,但是有什么用呢?也就是说VR只能做到更逼真的三维世界,它无法帮助人们更好地理解真实世界。
那么谷歌眼镜呢?HoloLems是不是和它更像。没错,但HoloLens不等于谷歌眼镜,它比后者多了这些:
●三维感知能力,可以对身边的三维场景进行建模。而谷歌眼镜只能看到RGB像素值。
●三维渲染能力。
●人机交互能力,HoloLens可以用手势进行控制。
其实AR离我们并不遥远,甚至很多人应该都接触过。常见的AR应用是基于摄像头的,包括了基于黑白标记图片的AR以及基于任意图片的AR,最近在朋友圈中很火的3D小熊就是基于AR的应用。但是这些应用只能检测到图片所在的那个平面。HoloLens比它们都牛,它能检测到各个角度的三维场景!
HoloLens背后的技术
简单地说明了HoloLens到底是怎样的一个产品,你是不是更好奇在HoloLens背后是哪些技术支撑起了这些酷炫的体验?下面我们就来一一解读。
如何得到三维场景深度信息
让我们回到AR的定义,想要实现增强现实,必须先理解现实,那么对于HoloLens而言现实是什么呢?是传感器的数据。HoloLens上的传感器是什么?是摄像头。同样是摄像头,为什么HoloLens就可以感知深度呢?微软Kinect在这方面很成功,那么是不是HoloLens上放了一台嵌入式的Kinect呢?答案自然在HoloLens中。从HoloLens的官方图片中我们可以看到它拥有四个摄像头,左右两边各两个。通过对这四个摄像头的实时画面进行分析,HoloLens可覆盖的水平视角和垂直视角都达到120°。也就是说它采用的是立体视觉技术(Stereo Vision)来获取事物的深度图(Depth Map)。立体视觉是计算机视觉学科的一个子学科,专注于从两个摄像头的图像数据中得到真实场景中物体离摄像头的距离。下面,我们来看看摄像头是如何获取深度图的(查阅OpenCV文档可以了解具体函数的用法,地址:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html),其基本步骤如下:
1、摄像头校正(Undistortion)。由于摄像头的镜片出厂时都存在扭曲,为了得到精确的数据需要在使用前进行校正。常用的方法是基于棋盘的各个姿态拍几次,然后计算相机的矩阵参数。
2、图像对齐(Rectification)。因为两个摄像头的位置不同,因此它们各自看到的场景是有偏差的,左边的摄像头能看到最左的场景,右边的看到最右的场景,图像对齐的目的是得到相同的场景部分。
3、左右图像匹配(Correspondence)。在OpenCV中可以使用StereoBM得到Disparity Map。
4、通过重映射函数,比如“cv::reprojectlmageTo3D”,得到一张深度图。
如何通过多张深度图重建三维场景?
只有一张深度图是不够的,它只是某一时刻真实场景在摄像头中的映射。要想得到完整的三维场景,我们需要分析一系列的深度图。而在获得多张深度图后,HoloLens将如何重建三维场景呢?答案是SLAM(Simultaneous Localization And Mapping),即同步定位与建图系统。这个技术被用于机器人、无人汽车、无人飞行器的定位与寻路系统。解决的是非常哲学的问题:
●我现在在哪里?
●我可以去哪里? SLAM有很多实现的方式,有一个开源的资料库(http://pointclouds.org)实现了很多深度图的处理和匹配算法,可以认为是三维版本的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应该有关,答案在这个页面中:http://research.microsoft.com/en-us/people/shahrami。Shahram Izadi是微软剑桥研究院的首席研究员(Principal Researcher)及研究主管(Research Manager)。他所领导的互动3D技术组(Interactive 3D Technologies)为微软的多项产品提供了研究力量,包括Kinect for Windows,Kinect Fusion以及HoloLens。
让我们来看看Kinect Fushion是如何通过多张深度图重建三维场景的,这会帮助我们了解HoloLens的技术原理。Kinect Fushion通过在室内移动Kinect设备,获取不同角度的深度图,实时迭代,对不同的深度图进行累积,计算出精确的房间以及房间内物体的三维模型。它分四个阶段:
1、深度图格式转换,转化后的深度单位是米,用浮点数保存,并计算顶点坐标和表面的法向量。
2、计算世界坐标系下的摄像头姿态(包含位置和朝向),通过迭代的对齐算法跟踪这两个值,这样系统总是知道当前的摄像头与最初的姿态相比变了多少。
3、将姿态已知情况下的深度数据融合到单个三维乐高空间里,你也可以叫它为MineCraft空间,因为这个空间的基本元素不是三角形,而是方格子。HoloLens演示视频中频频出现MineCraft场景估计也和这个阶段有关。
4、基于Raycasting的三维渲染,Raycasting需要从当前的相机位置发出射线,与三维空间求交集。乐高空间特别适合Raycasting,可以用八叉树来加速射线的求交运算。Raycasting、Raytracing以及Rasterization是三种常见的渲染方式,这里就不展开了。
在HoloLens的应用中其实只需要运行到第三步,即获取三维乐高模型就可以了,第四步并不是必需的。因为HoloLens的屏幕是透明的,不需要再把房屋的模型渲染一遍,我们自带的眼睛已经渲染了一遍了。
HoloLens的应用场景
那么,HoloLens到底能为我们带来怎样的应用呢?在谈这个问题前,有必要先对Holo SDK进行一个猜想:这个SDK里有哪些功能呢?根据官方Demo中的场景,基本功能至少有:
●摄像头看到的图像,即当前场景的Color Buffer。
●当前场景的深度图,Depth Map或z Buffer。
●SLAM合成后的三维场景,这个场景所在的空间我们暂且称为Holo Space,它可能是以乐高方块的形式表示,也可能是用三角形来表示。
●HoloLens设备在Holo Space中的坐标(x,y,z)、朝向(tx,ty,tz)。
●手势识别的结果,类似HRESULT OnGestureDetected(DWORD dwHandld,DWORD dwEventld,LPVOID IpUserInfo)的样子。
●语音识别的结果,类似HRESULT OnVoiceRecognized(std::string