| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 面向MR眼镜的手势交互(二)地表最强的手势交互原理剖析(HoloLens 2)【上】 -> 正文阅读 |
|
[游戏开发]面向MR眼镜的手势交互(二)地表最强的手势交互原理剖析(HoloLens 2)【上】 |
简介????????HoloLens是目前唯一一款真正意义上没有手柄,以手势为主要交互方式的第一梯队MR眼镜。在目前已有的眼镜中,HoloLens的手势交互的准确性、稳定性、鲁棒性是最能打的,双手交互的效果更是我目前体验过所有眼镜里的天花板。正如国外的一家评测网站说,HoloLens的技术是超前于当前时代的(HoloLens 2 Review: Ahead Of Its Time, For Better And Worse)。关于HoloLens的原理,有兴趣可以看微软大佬的介绍视频,从硬件到软件,从手势到mesh到眼动,整个技术链路都有一些介绍:链接。可以先简单看一个视频,感受下HoloLens手势交互的效果: hololense手势效果 硬件相关????????手势输入的相机采用TOF(Time Of Flight)深度摄像头。TOF原理很好理解,计算发射光束的飞行时间即可计算每个像素点的深度,详细原理可以参考:TOF相机原理 ????????可以很清晰地从图中看到,HoloLens 2的深度相机位于中间位置,方向略微朝下,朝下的安装方式可以保证尽可能大地捕捉到用户的手部区域。在正常手势交互的过程中,用户总是倾向于在较低的地方进行手势交互,“抬手”的动作是很累的,这种朝下安装的方式可以保证大部分用户“舒适”的区域可以准确完成手势交互。 ????????当然,也可以直接买相机模组Auzre Kinect(也就是俗称的kinect3),HoloLens 2所用的同款摄像头。 ????????可以看下对比图,Auzre Kinect相比于上一代kinect v2提升还是非常明显的,更轻、更小、分辨率更高、成像质量更高等等。总而言之是吊打,详细信息可以参考微软文档:链接。HoloLens 2各种算法的鲁棒性、稳定性、准确性(包括手势)和相机成像水平是直接相关的。当然,HoloLense手势的迟滞感也需要相机背锅,相比于灰度数据,深度图像有更大的绝对时间延迟。 手势算法原理????????首先声明下,以下部分都是根据微软已公开的资料或论文进行整理,可能会有一些理解或描述上的偏差,如果有不恰当的地方,还请斧正。下文的各种图均取材于微软的论文以及视频截图。如果想对手势链路有一个大致的了解,可以仔细看下如图所示的SIGGRAPH2016的这篇文章。 ????????稍微整理了下微软手势相关的的一些论文,可以重点关注后两篇,本文主要也是基于后两篇的链路进行展开。
问题阐述????????首先套用[10]视频的图来描述下问题: ????????输入一张深度图,期望得到模型手的28关节角信息。 ????????虽然现在有很多基于深度学习的方法,但HoloLens采用的还是传统的模型拟合方案(并且效率和效果吊打深度学习)。 ? ? ? ? 这个问题的难度在于手的自由度很多、指头之间相似、某些姿态会自遮挡、全局旋转、深度图存在噪声等等。 模型手介绍????????介绍一下什么是smooth model,左边是熟悉的三角面片模型(可以通过关节控制模型手的姿态),至于为啥是28维后面会讲;通过这28维可以控制手模型的运动形成一个mesh模型,再通过三角表面细分形成一个连续的光滑的表面。 ?????????简单介绍下表面细分Subdiv[12],这是1987年就提出的图形学概念,通过不断四等分三角面片来达到让模型更光滑的目的,计算方式也挺简单,不断加权和完事。但是不断迭代的计算量还是很大的。 ????????微软提出一种无穷表面细分的近似方法[13],可以快速获取到连续且平滑的模型,具体方法不展开,知道有这么一种简化计算的方法即可。 ? ????????下面两张图取自同一拨人的2015年的一篇文章[8],模型手总计28个自由度,手整体旋转和平移6个自由度,手腕两个自由度,其余每个手指5个自由度,总计28个自由度。 ?????????根据稀疏的Mesh模型手,通过近似subdiv生成光滑细腻的蒙皮模型手。 ? 算法Architecture????????这里的框架选自[10]的介绍,虽然是五六年前的图了,但大致链路还是很清楚的。 ????????首先深度图上检测出手的位置,Crop出手部19CM的区域,通过随机森林的方法(现在可能换了,但影响不大)估计出手的粗糙位置,接着构建优化问题,通过LM算法求解这个非线性最小二乘问题。 ????????问题的关键在于——如何构建优化问题的能量函数以及如何工程上高速地解决如此高自由度的优化问题。 能量函数Energy Function????????能量函数这块,文章写得真的是很良心了,目前用的肯定已经经过了进一步的改良,但从[10]这篇文章里确实能感受到漫长的优化设计过程。文章甚至给出了建议的配比,感恩(虽然也没啥用)。 data项????????首先是最重要的data项,包含了位置和法向(先不考虑如何获取到模型上对应的点);思路很直观,距离和法向L2距离尽可能小;法向很重要,在表面连续的模型上非常有作用(可以将距离更靠近另外一根指头的点拉到正确的指头),防止指头之间乱跳。 ? background项????????将模型上的点投影到深度图2D图像,如果超出了手势轮廓范围,增加惩罚,也是平方形式 ? ? Pose项????????保证手型,如果手部姿态过于奇怪会带来较大的惩罚(协方差矩阵控制),也是平方形式 limit项????????与其他模型不同,这里允许超出范围,只是会带来惩罚,未超出范围为0,不考虑整体RT,平方形式 temp项????????连续帧之间的变化幅度应该尽可能小(包括整体RT) int项????????惩罚模型自交叉的情况(数学上很简洁),平方形式 tips项????????2014年的一篇paper检测手指,再强行约束一下五根指头(这个感觉太Trick了…) 下期预告下一篇文章会就优化问题的一些细节以如何保证手势姿态回归又快又好进行阐述。 Reference
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 23:53:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |