图像对齐,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的屏幕是透明的,不需要再把房屋的模型渲染一遍,我们自带的眼睛已经渲染了一遍了。
关注天下网吧微信,了解网吧网咖经营管理,安装维护:
本文来源:不详 作者:佚名