简介
用户体验 (UX) 指南可帮助在应用中实施英特尔® 实感™ 技术。 然而,想要实现这些指南的可视化却非常困难,原因有以下四点: (a) 在应用设计阶段,没有用于最终用户测试的原型,但必须在无法触摸的环境中解析最终用户交互,(b) 应用可用于不同外形的设备,比如笔记本电脑和一体机,用于交互的视野 (FOV) 和用户位置各不相同,(c) 所使用的彩色摄像头和景深摄像头的保真度和 FOV 各不相同,(d) 不同的英特尔® 实感™ SDK 模式有不同的 UX 要求。 因此关键要有一个实时反馈机制来判断这种影响。 本文将介绍专为支持开发人员使用英特尔® 实感™ 应用而开发的应用,以帮助开发人员查看和了解 UX 要求,并在代码中实施这些指南。 本文可供下载适用于该应用的源代码。
应用
该应用仅适用于前置摄像头。 本应用范围内包含 F200和 SR300两种摄像头。 在该应用中,这两种摄像头之间可无缝切换。 如果使用 F200 摄像头,该应用将基于 Windows* 8 或 Windows® 10 运行。 如果使用 SR300 摄像头,该应用将要求安装 Windows 10。
该应用中有两个窗口。 一个窗口提供实时摄像头馈入,以支持用户进行交互。 该部分还提供可视指标,模拟您将在应用中提供的可视反馈。 在以下场景中,我们将调出已经实施的可视反馈。 另一个窗口提供实施特定 UX 场景所需的代码片段。 下文将逐一介绍各个场景。 WPF 是一种开发框架。
英特尔实感 SDK版本: Build 8.0.24.6528
英特尔® 实感™ 景深摄像头管理器 (DCM) (F200) 版本: 1.4.27.52404 版
英特尔® 实感™ 景深摄像头管理器 (SR300) 版本: 3.1.25.2599 版
该应用预计适用于更多 SDK 版本,但仅上述版本通过了验证。
场景
普通场景
景深和 RGB 分辨率
RGB 和景深摄像头支持不同的分辨率,而且宽高比也各不相同。 不同的模式对这些摄像头也有不同的分辨率要求。
以下截图显示了使用多种模式时 SDK 文档所规定的流分辨率和帧速率:
UX 问题:
如何知道哪部分屏幕用于 3D 交互,哪部分用于放置 UI? 当最终用户超出交互区域后,如何通过可视反馈或音频反馈将这种情况告诉他们?
实施:
该应用使用 SDK API(下文将会提到)获取适用于各模式的色彩和景深分辨率数据,并在色彩图上绘制深度图,以展示叠加区域。 在摄像头馈入窗口中,查看表示色彩图和深度图重叠区域的黄色边界。这就是可视反馈。 从 UX 的角度来说,现在您可以观看屏幕,确定用于 FOV 3D 交互的屏幕区域,以及用于放置 UI 元素的区域。 在第一栏中选择不同的模式以及可用的色彩和景深分辨率进行试验,了解从 RGB 至景深的映射对预期用途的影响。 以下截图显示了重叠区域如何随输入的变化而变化的示例。
使用景深和色彩分辨率时的示例:
试验用户在不同的色彩和景深分辨率之间进行切换时映射所发生的变化。 并选择其他使用景深和 RGB 的模式,查看色彩和景深分辨率支持列表的变化。
仅使用景深分辨率时的示例:
使用手部骨骼跟踪时可动手试验该示例。 该用例无需彩色摄像头,不过您可以切换各种可用的景深分辨率,查看屏幕映射的变化。
仅使用色彩分辨率时的示例:
如果应用只能使用面部识别,您只需面部边界框即可,因此 2D 功能足以满足这一需求。 但是如果您需要 78 项特征,那么需切换至 3D 示例。
示例应用可在本文中下载,它介绍了在应用实施该切换流程所需的代码。 重点来说,为不同模式创建景深和色彩分辨率迭代列表所需的两个 API 分别为 PXCMDevice.QueryCaptureProfile (int i) 和 PXCMVideoModule.QueryCaptureProfile()。 不过,为了便于查看两张图的重叠,还需要使用 Projection 界面。 我们知道,每个像素都有一个相关的色彩和景深值。 在本示例中,为使景深图和色彩图重叠,我们仅选择一个景深值。 为实施此景深值,该应用使用 blob 模块。 此方法使用离摄像头最近的 blob(说你的手),并映射该 blob 的中心(屏幕中的蓝绿色点)。 然后将该像素的景深值用作单个景深值,以将景深图映射在色彩图上。
最佳光照
英特尔实感 SDK 不直接提供 API 来识别摄像头运行时环境中的光照条件。 如果光照条件较差,会导致色彩数据中出现许多噪音。
UX 问题:
在该应用中,最好为用户提供可视反馈,提示用户移到光照条件理想的环境下。 在该应用中,观察摄像头馈入如何在屏幕上显示当前亮度值。
实施:
该应用使用 RGB 值并使用对数平均亮度来确定光照条件。 有关如何使用对数平均亮度的更多信息,请访问此处。
以下公式用于确定像素的对数平均亮度:
L = 0.27R + 0.67G + 0.06B;
数值范围为 0-1,其中 0 表示光线极暗,1 表示光线明亮。 本示例不定义阀值,因为这需要开发人员进行试验。 影响亮度值的因素包括背光、黑色衣服(可导致许多像素给出接近于 0 的等级,从而降低平均值),室外和室内光照条件等等。
因为每帧数据中的像素都要执行这种计算,因此它属于计算密集型操作。 该应用展示了如何使用 GPU 实施这种计算,以达到最佳性能。
原始数据流
英特尔实感 SDK 提供 API 捕捉色彩和景深数据流。 不过在有些情况下,可能需要捕捉原始数据流,以执行低层计算。 英特尔实感 SDK 提供 C++ API 和 .NET 包装程序。 这意味着包含图像的内存位于未托管内存中,因此 在 WPF 中显示图像时并不处于最佳状态。
解决该问题的方法是使用 PXCMImage.ToBitmap() API 创建围绕图像数据包装的未托管 HBITMAP,并使用 System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap() 将数据拷贝至托管堆中,然后包装 WPF BitmapSource 对象。
UX 问题:
采用上述方法的问题是在 CPU 上完成 YUY2-> RGB 转换后,我们需将图像数据从未托管内存拷贝至托管内存。 这样会大幅降低该流程的速度,还会导致数据丢失和抖动的出现。
实施:
该应用展示了另外一种实施办法,即使用 Microsoft .NET 框架版本 3 的 Service Pack 1 中的 Direct3D* Image Source,使 WPF 中包含任意的 DirectX* 9 平面。 我们使用未托管 DirectX 库来进行色彩转换,从而支持在 GPU 上显示。 该方法还支持通过像素着色器处理 GPU 加速后的图像,从而满足自定义控制需求(例如处理深度图像数据)。 以下截图显示了自定义着色器所显示的原始色彩、IR 和景深流,以及深度图像。
面部识别
英特尔实感 SDK 中最常用的一种模式是面部模块。 该模块支持识别 FOV 中的四个人,还可为每张脸提供 78 个特征点。 使用这些数据点时,可以在应用中集成面部识别实施。 Windows 10 操作系统中的 Windows Hello* 可使用这些特征模版,以识别登录用户。 更多关于 Windows Hello 工作原理的信息,请访问此处。 在此应用中,我们重点关注有关该模块的 UX 问题,以及如何提供可视反馈来纠正最终用户的交互,从而提升 UX。
UX 问题:
最大的 UX 挑战是最终用户不知道摄像头的 FOV 在哪里。 他们可能完全处于视锥范围之外,或离计算机太远,导致超出范围。 英特尔实感 SDK 会提供多项告警来捕捉这些场景。 但关键是如何向超出 FOV 范围的最终用户提供可视反馈。 在本应用中,如果最终用户处于 FOV 以及允许的范围内,将会提供一个绿色的边界框,表示用户处于交互区域内。 您可以将头移到计算机边缘或更远的地方来进行试验,此时你会看到,一旦摄像头丢失面部数据,会马上出现一个红色边界框。
实施:
英特尔实感 SDK 提供以下告警,以便有效处理用户错误: ALERT_FACE_OUT_OF_FOV、ALERT_FACE_OCCLUDED、ALERT_FACE_LOST。 更多关于告警的信息,请参阅 PXCMFaceModule。 该应用使用简单的 ViewModel 架构捕捉错误,并在 XAML 中针对错误采取行动。
沉浸式协作
设想一下您正在照相亭设置中尝试获取一张背景分割后的图像。 正如深度和 RGB 场景部分所述,每种英特尔实感模式的范围都不相同。 因此如何为最终用户提示最佳的 3D 摄像头范围,以便他们将自己放在合适的 FOV 中?
UX 问题:
与面部识别场景一样,关键是如何向在该范围中移动的最终用户提供可视反馈。 在本应用中,请注意,该滑块可为摄像头 FOV 设定最佳范围,从而支持 3D 分割(绿色部分)。 如要确定最小范围,看将左侧滑块移动至带有摄像头图片的那端。 注意像素如何变成白色。 另外,如果想确定最大的最佳范围,可向右移动右侧滑块。 如果超出最佳点,像素将变成红色。 两个滑块之间的范围则为支持图像分割的最佳范围。
花一秒钟时间看看最后一张图像。 您将注意到,使用 BGS 时会出现另一个 UX 问题。 向背景(此案例中为椅子)移动时,3D 分割模块将通过前景和背景对象创建一个 blob。 如果背景为黑色,而且您穿着黑色衬衫,也会出现这种情况。 识别像素不均匀的深度非常困难。 本应用不解决该场景问题,但我们想提出这一 UX 挑战以引起大家的注意。
实施:
3D 分割模块提供告警以处理 UX 场景。 我们此处实施的部分重要告警包括: ALERT_USER_IN_RANGE、ALERT_USER_TOO_CLOSE 和 ALERT_USER_TOO_FAR。 该应用实施这些告警,为用户提供色素沉淀和纹理反馈,以告知用户离得太近或太远。
3D 扫描
前置摄像头的 3D 扫描模块支持扫描面部和小物体。 在该应用中,我将通过面部扫描示例展示部分 UX 挑战,以及如何实施代码以添加可视反馈和音频反馈。
UX 问题:
如要获得良好的扫描效果,其中面临的一个主要挑战是如何检测扫描区域。 通常,扫描开始后的几秒钟会锁定这一过程。 以下截图显示了为获得良好扫描效果所需的摄像头区域。
如果用户无法确定准确的扫描区域,扫描模块将无法正常运行。 以下是无法正常运行的示例场景: 扫描面部时,用户要求面对摄像头以便摄像头检测到面部,然后‘缓慢地’从左至右转动头部。 因此观看屏幕时,当用户处于摄像头 FOV 内,必须以边界框的形式为用户提供有关面部的可视反馈。 请注意,扫描开始之间,我们才需要这种反馈。 扫描开始后,用户从左至右转动头部,无法看到屏幕,因此这种可视反馈毫无用处。 在示例应用中,我们同时创建了可视反馈和音频反馈,以辅助该场景。
实施:
PXCM3DScan 模块包含以下告警: ALERT_IN_RANGE、ALERT_TOO_CLOSE、ALERT_TOO_FAR、ALERT_TRACKING 和 ALERT_TRACKING_LOST。 在该应用中,我可同时捕捉这些告警,并按照需要提供可视反馈或音频反馈。 以下截图显示应用正在捕捉告警和提供反馈。
扫描开始之前以及扫描过程中的可视反馈:
请注意在此示例中,我们不展示如何保存和渲染网格。 关于如何在应用中实施 3D 扫描的具体信息,请参阅 SDK API 文档。
总结
在应用中使用英特尔实感技术会遇到诸多 UX 挑战,包括如何理解非触摸反馈,以及最终用户如何使用和理解这项技术。 通过实时解释部分 UX 挑战和有助于解决这些挑战的代码片段,我们希望该应用可帮助开发人员和 UI 设计人员更好地了解英特尔实感技术。