使用 Intel® RealSense™ 技术进行脉搏检测
Intel Black Belt 的 Lee Bamber 描述了计算机检测脉搏的不同方法,并解释了使用 Intel RealSense F200 相机和 Intel RealSense SDK 进行此操作的便捷性。
1. 引言
当我第一次听说一个系统可以在不接触我的情况下确定我的心率时,我持怀疑态度,认为这介于欺骗和巫术之间。多年以后,我有了深入研究所需技术的理由,并意识到这不仅是可能的,而且已经实现,并且已经集成到最新版本的 Intel® RealSense™ SDK 中。
直到我找到并运行了 SDK 中的相应示例程序,读取了数值,然后通过测量脖子处的脉搏 15 秒并乘以四来与我自己的心率进行比较时,我才意识到它真的有效!我跳了几下以提高心率,令人惊讶的是,几秒钟后,计算机再次准确地计算出了我加速的心率。当然,这时我已经被这个发现激动得不行,并且对能够了解用户平静程度的计算机的前景感到兴奋,以至于我无法将心率降到低于正常水平的每分钟 76 次以测试较低的水平。
2. 这为什么重要
一旦您开始探索免提控制系统、3D 扫描和运动检测的尖端世界,您最终会发现您还可以用 Intel® RealSense™ 相机 做些什么。当您从大型、清晰定义的系统转向更细微的检测形式时,您就进入了一个计算机获得前所未有能力的领域。
脉搏检测以及其他 Intel RealSense SDK 功能,是更细微的信息流,有一天它们可能在您的日常生活中扮演与键盘或鼠标一样重要的角色。例如,如果您患有 RSI(重复性劳损),键盘或鼠标对您来说毫无用处,并且无论多么巧妙的接口都无法帮助您,如果您分心、烦躁、困倦或不开心。通过利用读取用户身体和可能情绪状况的微妙科学,计算机可以采取行动,为用户带来利益并改善体验。假设现在是早上九点半,日历显示全天都有工作要做,而计算机检测到用户感到困倦和分心。通过一些预先商定的方案,计算机可以播放您最喜欢的“唤醒我的 5 首劲歌金曲”音乐,显示您未来 4 小时的工作安排,并在屏幕上显示一些新鲜冲泡的咖啡图片,以温和地提醒您该打起精神了。
技术创新并非总是关于哪个按钮做什么,或者我们如何使事物更快、更轻松、更智能,它还可以关乎改善生活质量和丰富体验。如果您的电脑能够感知您的需求并主动采取措施帮助您,从而让您的一天过得更好,那只能是一件好事。
再举一个例子,这与脉搏检测没有直接关系,想象一下您的计算机能够检测温度,并注意到当您变热时,您的工作效率会下降(即打字更少,注意力更不集中等),并且还记录了当温度较低时,您的工作水平会提高。现在想象一下,它每天都会记录您的传感器数据,并且在一个特别炎热的早晨,您的计算机弹出一个提示,说两天前您也感到很热,您离开了座位 20 秒,2 分钟后一切都凉爽了(您那天的工作水平也提高了)。这样的提示可能会让您回想起您开了几扇窗户,或者在隔壁房间打开了空调,然后您就采纳了建议,您的一天也因此得到了改善。允许计算机收集这类数据并尝试利用这些数据来改善您自己的生活,最终将带来改善所有人生活的创新。
脉搏估算只是计算机从周围世界提取细微数据的一种方式,随着技术的不断发展,脉搏检测的复杂性将使读数与传统方法一样精确。
3. 这到底是怎么实现的?
我对脉搏估算当前工作原理的深入研究,让我简要地了解了迄今为止被证明成功的方法,例如检测所谓的头部微动。
显然,当您的心脏跳动时,会向头部泵入大量血液以保持大脑的正常运作,这会产生一种不自主的、微小的运动,可以被高分辨率相机检测到。通过计算这些运动,并经过正常的多普勒效应和其他可确定运动的过滤,您可以计算出用户每分钟可能的心跳次数。当然,许多因素会干扰这种技术,例如可能被误认为微动的自然运动,或者在您处于运输途中时捕获的抖动画面,或者您只是感到寒冷和发抖。在受控条件下,已被证明该技术仅使用高分辨率彩色相机和能够过滤视觉噪声并检测脉冲的软件即可正常工作。
另一种更接近 Intel RealSense SDK 使用方法的技术是检测实时流中的颜色变化,并利用这些颜色变化来确定是否发生了脉冲。该技术工作的帧率不必很高,相机也不必完全静止,但理想的照明条件才能获得最佳效果。这种替代技术有多种变体,每种变体的成功程度各不相同,我将在下面简要介绍其中两种。
显然,当您不戴眼镜时,该技术效果更好,并且通过对眼球进行高分辨率捕获,您更有可能在检测过程中检测到眼部血管的细微变化。与皮肤下的静脉不同,皮肤下的静脉会受到次表面散射和其他遮挡的影响,而眼睛则为头部血管系统提供了一个相对清晰的窗口。您确实需要克服一些障碍,例如锁定眼睛的像素,以便只处理眼睛区域而不是周围的皮肤。您还需要检测眨眼并跟踪瞳孔,以确保没有噪声进入样本,最后,您需要运行足够长的时间以获得良好的背景噪声感,在放大剩余的彩色像素以帮助检测脉搏之前,需要消除这些噪声。
您需要运行样本多长时间因人而异,并且会有很多噪声需要您放弃样本,但即使以每秒 30 帧的适度速率运行,您也会有 20-30 个样本来找到一个脉搏(假设您的对象心率在每分钟 60 到 90 次之间)。
如果您发现眼睛的颜色信息不足,例如对于坐在离电脑较远的用户、戴眼镜或冥想的用户,那么您需要另一种解决方案。另一种皮肤颜色变化方法的变体是使用红外线(IR)流,这是 Intel® RealSense™ 相机 readily available 的。与彩色和深度流不同,红外线流可以以每秒 300 帧的速度发送到软件,速度非常快。然而,如前所述,我们只需要大约每秒 30 帧的优质样本来找到我们难以捉摸的脉搏,而您从相机获得的红外线图像有一个特殊的技巧可以揭示。
为简洁起见,我将不详细介绍红外线的特性及其众多应用。 suffice to say,它占据了人眼无法完全感知的光谱。其结果是,当我们将这种特殊光线照射到物体上,捕获结果并将其转换为我们可以看到的东西时,它与光谱上方相邻的颜色反应略有不同。
用红外线照射人体的一个副作用是,我们可以检测到皮肤表层附近的静脉和其他特征,例如检测本已非常干净的衬衫上的油脂。鉴于血流是我们想要测量的精确指标,您可能会认为这种方法非常适合测量心率。经过一点研究,您会发现红外线确实被用于扫描人体并检测血液在循环系统中的流动,但仅在严格的医疗条件下。使用红外线的缺点是,您有效地限制了从相机接收到的信息,并且必须丢弃通过普通 RGB 彩色流返回的同样有价值的可见光谱。
当然,最终的解决方案是将所有三个信息源结合起来;获取微动、红外线血流和全彩色皮肤变化,作为一系列检查和平衡,以拒绝假阳性并产生可靠的脉搏读数。
4. Intel® RealSense™ 技术如何检测您的脉搏
现在您已经对无接触心率检测的科学有了相当多的了解,我们将探讨如何将此功能添加到您自己的软件中。您可以自由扫描来自相机的原始数据并实现上述一种或所有技术,或者,感谢 Intel RealSense SDK,您还可以通过几行代码实现自己的心率检测。
第一步与脉搏检测功能没有直接关系,但为了清晰起见,我们将在此介绍,以便您全面了解需要哪些接口以及可以暂时忽略哪些接口。我们首先需要创建一个 PXC 会话、一个 `SenseManager` 指针和一个 `faceModule` 指针,因为我们将使用面部系统来最终检测心率。有关此源代码的完整版本,最好的查看和编译示例是面部跟踪示例,其中包含以下代码,但支持其他功能,例如姿态检测。
PXCSession* session = PXCSession_Create();
PXCSenseManager* senseManager = session->CreateSenseManager();
senseManager->EnableFace();
PXCFaceModule* faceModule = senseManager->QueryFace();
一旦完成了这些基础工作,并且您能够访问关键的 `faceModule` 接口,您就可以进行特定于脉搏的函数调用,首先是通过命令启用脉搏检测器。
PXCFaceConfiguration* config=faceModule->CreateActiveConfiguration();
config->QueryPulse()->Enable();
config->ApplyChanges();
`ActiveConfiguration` 对象包含了面部系统所需的所有配置,但与获取心率读数直接相关的唯一一行代码是 `QueryPulse()`->`Enable()` 函数,该函数激活系统的这一部分并使其运行。
最后一组命令可以深入到我们想要的数值,正如您在下面看到的,它依赖于解析系统中可能检测到的所有面部。它不假定只有一个人坐在电脑前——可能有人在您身后张望,或者站在背景中。您的软件必须进行额外的检查,也许使用姿态数据结构,来确定哪是主头部(可能是最近的一个),并且只使用该面部/用户的平均心率。下面是未进行此类区分的代码,它只是遍历所有检测到的面部并获取每个面部的平均心率,尽管在此示例中它不对该值执行任何操作。
PXCFaceData* faceOutput = faceModule->CreateOutput();
const int numFaces = faceOutput->QueryNumberOfDetectedFaces();
for (int i = 0; i < numFaces; ++i)
{
PXCFaceData::Face* trackedFace = faceOutput->QueryFaceByIndex(i);
const PXCFaceData::PulseData* pulse = trackedFace->QueryPulse();
if (pulse != NULL)
{
pxcF32 hr = pulse->QueryHeartRate();
}
}
您可以忽略大部分代码,除了 `trackedFace`->`QueryPulse()`,它要求系统根据到目前为止收集的数据来计算最新的平均心率,如果数据可用,则使用 `pulse`->`QueryHeartRate()` 来查询该数据并以每分钟跳数返回平均心率。
通过运行 Intel RealSense SDK 中包含的面部跟踪示例,并取消选中右侧除检测和脉搏之外的所有内容,然后按开始,在保持相对静止 10 秒钟后,您将看到自己的心率。
一旦您从上面的示例中剥离了非脉搏相关代码,您就可以将其作为进一步实验该技术的良好代码基础。也许绘制一个读数随时间变化的图表,或者添加代码让应用程序在后台运行并发出声音提示,让您知道何时变得过于放松或兴奋。更重要的是,您可以监控返回读数的准确性和分辨率,以确定它们是否足以满足您的应用程序需求。
5. 技巧与窍门
要做的事
- 为了获得最佳结果,不仅在检测心率时,而且在所有捕获工作中,都要在光线充足的条件下(不受阳光直射)使用相机,并在采样阶段保持相对静止,直到获得准确的读数。
- 由于当前的 SDK 只提供一个用于脉搏检测的函数,因此为创新者提供了广阔的空间,可以利用原始数据范围来获取用户更准确、更即时的读数。目前的心率估算需要超过 10 秒才能计算完成,您能编写一个在更短时间内完成测量的算法吗?
- 如果您想在户外进行心率估算并编写自己的分析算法,建议您仅使用彩色流来检测皮肤颜色变化。
不要做的事
- 不要尝试激活面部跟踪中的所有选项来检测心率,因为这会降低结果的质量或根本无法报告值。您需要有足够的处理能力可供面部模块使用,才能准确估算心率。
- 不要在户外空间使用红外线检测技术,因为任何直接的阳光照射都会完全淹没返回的红外线信号,使任何分析都变得不可能。
6. 总结
正如本文开头所提到的,与免提控制和 3D 扫描的好处相比,心率检测的好处并不那么显而易见,但当与其他感官信息相结合时,可以在用户最需要的时候提供无价的帮助。我们还没有达到仅通过医生办公室窗户走过就能记录心率的阶段,但我们已经完成了一半,现在只需要时间和进一步的创新和应用,它就能在我们现代世界中占有一席之地。
从个人角度来看,作为一名过度劳累、老派、拼命写代码的遗老,我现在比年轻时更看重我的健康和整体工作状态,我乐于接受任何能提供帮助的帮助。如果帮助的形式是计算机唠叨我“醒醒,喝咖啡,看着前面,别忘了,开扇窗,休息一下,吃点东西,去散散步,玩个游戏,去看医生你没脉搏了,听莫扎特,然后睡觉”,特别是如果是一个好听的电脑声音,那就随它去吧。
当然,作为一台电脑,如果唠叨有点过头,你总是可以关掉它。但我总觉得,我们会开始欣赏这些温和的提醒,知道在所有冰冷的逻辑背后,电脑只是在做我们要求它们做的事情,而归根结底,我们都可以得到一点帮助,即使是像我这样的老派、拼命写代码的遗老。
关于作者
当不写文章时,Lee Bamber 是 The Game Creators ( http://www.thegamecreators.com ) 的首席执行官,这是一家总部位于英国的公司,专门从事游戏创作工具的开发和分发。该公司成立于 1999 年,以及周围的游戏开发者社区,负责许多受欢迎的品牌,包括 Dark Basic、The 3D Game Maker、FPS Creator、App Game Kit (AGK) 以及最近的 Game Guru。