1.设计概念
1.1 设计目的
图像视频处理技术源于 20 世纪 20 年代,借助图像视频处理技术,人类不但可以从更多角度观察世界,更能得到众多蕴含在图像中肉眼无法察觉到的信息,是现代人们从图像视频中获取信息的必要手段。
二十一世纪以来,随着计算机技术的发展,图像处理技术广泛应用到了医疗、航天航空、无人驾驶等多个领域。在医疗领域中,心率是反应人身体健康的一项重要指标,而传统的接触式测心率方法,对皮肤较脆弱的老人及幼儿身体有一定的伤害。MIT 学者 Hao-Yu 提出的欧拉视频放大算法,可将人脸视频中面部血液流动带来的颜色变化进行放大,并据此实现无接触式心率。但其计算尤为复杂,处理所需时间很长,且对环境要求较为严格。
基此,我们对其算法进行优化,设计出更快运算速度, 可在更复杂环境较准确测心率的摄像头心率检测装置。本系统着眼机器视觉,是集合图像处理技术、HDMI 显示技术的智能装置, 通过网络摄像头获取人脸视频图像,通过 FPGA 进行分析处理,得到心跳信号, 并将计算得出心率值实时显示在 HDMI 屏幕上。
1.2 应用领域
本作品应用范围广泛,可应用于众多需要检测心率信息的场景。例如,将此设备集成到个人手机,方便用户实时掌握自己的心率信息;医院诊疗时使用 非接触式检测心率,以减少对病人的额外负担;智能手表厂商,可以将其用于 自家手表心率测量功能的优化。
1.3 适用范围
本系统适用于环境光线较为稳定的环境,且需要使用者裸露部分皮肤。
1.4 主要技术特点
非接触式心率监测,通过摄像头实时图像处理并得到准确心率值。
2.系统组成及功能说明
2.1 具体功能概述
摄像头位于显示器前方,被测者尽量保持静止并露出额头处于摄像头前方,摄像头采集人脸画面,并由显示器显示,fpga 系统对采集到的画面进行:自动面部识别划定检测区域、心率信号提取、结果显示等处理。最终心率检测结果将显示在显示器上。
2.2 系统介绍
2.2.1 原理概述
心脏周期跳动引起皮肤下血液流量的周期性起伏,使得皮肤反射光的颜色产生人眼无法察觉的微弱周期性变化,这个颜色变化可以被市面上常见的摄像头采集到。通过提取这个微弱颜色变化的频率即可得到被测者的心率。
2.2.2 硬件模块划分
整个系统分为三个硬件模块,分别是画面采集模块、fpga 图像处理模块、 HDMI 显示模块。画面采集模块负责收集人脸视频图像,并将其传给 fpga,利用 fpga 处理采集到的视频画面得到测试者的心率,最终将心率信息和图像画面一同输出到 HDMI 显示器进行显示。
![1719828144997951.png 1.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828144997951.png)
2.2.3 fpga 内部软件模块划分
其中 fpga 图像处理模块使用 Xilinx 公司的 pynq 平台进行实现,其中又划 分为以下几个软件模块:画面获取模块,感兴趣区域 roi 获取(人脸识别)模块,变化信号提取模块,快速傅里叶变换模块,运动噪声分离模块,心率信号提取模块 ,画面合成与显示模块。
2.3 开发平台介绍
Xilinx 公司的 PYNQ-Z2 开发板是一款支持 PYNQ 开源框架的开发平台。PYNQ-Z2 除支持传统 ZYNQ 开发方式外,还可支持 Python 进行 APSoC 编程, 并且代码可直接在 PYNQ-Z2 上进行开发和调试。由于我们本次项目会进行大量图像处理。借助 python 的 OpenCV 等开源库,可以使众多图像处理步骤得到简化,有利于实现更复杂的功能。
![1719828163393091.png 3.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828163393091.png)
2.4 各模块介绍2.4.1.数据采集模块
使用摄像头拍摄人脸画面,通过 usb 接口与 fpga 开发板相连接。其中摄像头为 aoni 奥尼网络摄像头,其影像解析度为 1920×1080,视频帧率为 10- 30fps。
由于本文通过采集血液流过面部毛细血管引起面部颜色变化信号来测量心率,故摄像头色彩精度不能太低。
2.4.2. FPGA 内部软件模块
(1)画面获取部分
将网络摄像头传入的视频信号逐帧提取,以便后续处理。
(2)感兴趣区域 roi 获取(人脸识别)部分
人体皮肤表面下蕴含大量毛细血管,心跳带来的毛细血管流量的周期性变化对照射在皮肤上的光照的衰减程度周期性变化,且不同波长的光线衰减系数不同,产生的效果就是皮肤颜色会产生微弱的周期性变化,其频率就是心跳。相较于其他部位,人体面部的毛细血管分别尤为丰富,对光线的吸收程度相对较大,因此我们选取面部相关区域提取受试者的心率信号。经过实验分析,额头皮肤最能得到稳定的心率信号,我们最终选定额头的皮肤作为最终 roi 区域。
首先采用 Adaboost 面部检测算法从每一帧视频中识别出受测者的面部,并在面部区域中提取额头部分作为 roi 区域。Adaboost 面部检测算法识别准确率高、识别速度快、能够较好地满足系统实时性的要求。Pynq 所提供的开源库 Open CV 中支持此算法。
为给予被测者一定准备时间,系统在人脸识别成功后将进行一定时间等待,在连续识别成功一定帧数后,即人脸识别已稳定才将进行变化信号提取。
为方便被测者准确测量到心率,系统自动识别检测区域并在不同情况下会做出不同的提示。[tr]当系统未检测到完整人脸时,系统提醒“No Face”。
![1719828175971215.png 4.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828175971215.png)
当人脸面部离摄像头过远,系统提醒“Please Be Close”。
![1719828184165818.png 5.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828184165818.png)
在开始测量心率时,系统屏幕提醒“Hold On!”。
![1719828197172949.png 6.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828197172949.png)
(3)变化信号提取部分
由于心率引起的肤色变化非常微弱,其引起的数值变化量与肤色基值相比会被忽略且会被摄像头感光元件的噪声信号所淹没。
噪声处理:由于摄像头感光元件的噪声是随机产生的且均匀分布在各个像素 点上,所以我们将 roi 区域的像素点的同一通道内的数据求平均值即可有效的减 少摄像头感光元件的噪声的影响。
微弱变化提取:噪声处理后的数据二维图像阵列变为了一个随时间改变的一 个值,这个值是时间 t 的函数 I(t)。在时间 t 时刻,这个值因心率、振动等原 因发生变化,变化量为δ(t),初始条件为 I(0)=f(0)时,在 t 时刻 I(t)=I(0)+ δ(t)。处理目标是为了得到这个变化量δ(t)的频率信息,先要将δ(t)单独分 离出来。所以我们对 I(t)进行求导: I`(t) = δ`(t)
我们这里假设δ(t)为与心率同周期的周期函数,故其导数δ`(t)依旧为周 期函数,且周期不变,因此 I`(t) = δ`(t)保留了心率的频率信息又去除了基 量 I(0)的影响。
由于画面采集是离散的一帧帧画面,故这一步处理采用前后两帧画面的数值 求差值代替(离散求导)。
(4)快速傅里叶变换部分
为得到信号中的频率信息,我们采用频域计算的方式得到心跳的频率,将时域空间的脉搏波信号,通过快速傅里叶变换(fft)转换到频域空间,由频谱在一定范围内找到最强的频率信号,并认定其为心率的频率。
![1719828208559946.png 7.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828208559946.png)
![1719828218323777.png 8.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828218323777.png)
(5)运动噪声分离部分![1719828228658983.png 9.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828228658983.png)
由于人会不可避免的产生晃动,这种晃动带来的信号频 率非常接近心率的频率,我们称其为运动噪声,若不对信号进行分离,将难以从最终频谱中区分心率信号和运动噪声。
上图为原始视频的四帧图像与经欧拉视频颜色放大以及对 R 通道分量进行衰减的图像。将血液流动可视化后可见心跳引起面部颜色周期性变化。可视化 RGB 色彩空间面部颜色变化同时放大了运动噪声,而对 R 通道分量衰减的图像在对面部运动颜色可视化同时得到了较好的抑制。可视化血液流动效果详情见视频。
且血红蛋白对蓝光吸收程度比对红光吸收程度要强,血液流动使得皮肤颜色在红-黄之间起伏,对 RGB 各色彩通道 的影响程度由强到弱依次为:G>B>R。而运动噪声使得皮肤只有明暗变化,对 RGB 各通道在一定范围内是等比例放大或 缩小。得到结论,RGB 彩色通道中 G 通道应包含较强的心率信号和运动噪声,而 B 通道像素数据则几乎只包含运动噪声。因此我们使用 G 通道得到的频谱以一定比例减去 B 通道的频谱,即可将心率信号从运动噪声中分离。效果如右上图所示。
(6)心率信号提取部分
非剧烈运动情况下成年人心率范围为 50~150 次每分钟。因此我们在频谱的 0~160 次每分钟的范围内选择最高峰所对应的频率作为心率信号输出。
(7)画面合成与显示部分
将人脸识别结果、roi 划定结果、心率结果、用户提示合并到摄像头拍摄画面,并通过 pynq 自带的 HDMI 显示相关的库控制 HDMI 输出我们想要的画面。
2.4.3.HDMI 显示模块
各种类型的 HDMI 显示器都能作为终端显示,最终得到的心率数值和摄像头画面通过 HDMI 传输到 HDMI 显示器进行显示,方便用户调整面部位置和读取心率信息。
![1719828245963599.png 10.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828245963599.png)
3.完成情况及性能参数
完成情况:心率检测功能完全实现。
![1719828266876849.png 11.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828266876849.png)
性能参数: 单次心率检测时间:45s。 心率检测精度:1 次/分钟。
适用范围: 被测者未运动、被测者激烈运动后、光线良好、光线较差但进 行补光。 得到准确心率的概率(光线良好的情况):在被测者面部运动较小时。准确率为 100%,在被测者面部运动较大时准确率高达 90%以上。(与把脉心率值误差为±5 次为准 确)。
![1719828279343719.png 12.png](http://uphotos.eepw.com.cn/1677488899/pics/1719828279343719.png)
4.总结
4.1 主要创新点
(1)充分利用 PYNQ-2 核心板的运算性能,实现了实时无接触式高精确度检 测心率的功能。
(2)打破传统接触式心率测量方式,采用无接触式方法测量心率,被测者仅需面向摄像头静坐,该系统便可自动识别被测者并计算出心率者显示在屏幕 上。
(3)使用消费级网络摄像头做到精准的心率捕捉。
(4)用同一个 roi 区域的不同颜色通道来分离心率信号和运动噪声。
4.2 可扩展之处
(1)可将摄像头模块更改为红外线摄像头,即可将心率测量的环境拓展到夜间,以达到夜间睡眠实时心率检测的目的。
(2)将来对算法进行进一步改进,使得受测者即使在大范围运动也可以测量到心率。
(3)而本系统 Xilinx®提供的 PYNQ-2(PYTHON PRODUCTIVITY FOR ZYNQ)开发板,其映像是可引导的 Linux 映像,包括 pynq Python 软件包和其他开源软件包。本系统已可以在电脑上实现精准测量心率。因此本系统后期可方便进行 app,微信小程序的开发,当前主流测心率的装置多为智能手环,心率计等,其具有成本较高,等缺点,而人们如今手机无时无刻不在身边,因此基于本系统已有的算法进行 app 开发将有巨大的实用价值,由于其使用方便快捷,测量效果精准等优点,其推广普及亦较为方便。
(4)可改进系统的算法,使其在开发为 app 之后可在手机后台运作,实时监测使用手机者心率,当其心率值出现异常波动(如心跳突然剧烈增大),立即进行报警,对有心脏病的老人尤有益处。