摘 要
现如今,社会上老年人的数量正在持续增长,而伴随着的也是日益增多的老年人的安全问题,例如跌倒、突发疾病、失智等一系列对老年人生命产生威胁的问题,本文就其中的跌倒问题提出了一种基于OpenMv的跌倒检测算法,主要通过对OpenMv摄像头捕捉到的画面进行图像运算得到老年人的跌倒状态。本文提出的跌倒检测主要通过OpenMv自带的函数库以及三帧差分算法来实现,然后通过调整老年人身体中心坐标的波动范围来判断老年人是否已经跌倒。
关键词
老年人,摄像头,跌倒检测,三帧间差分算法
-
引言
如今,迎着这个大时代的一个大问题之一便是人口老龄化,伴随着国家的进步和社会的发展,现在人们对于自己家中老人的安全愈来愈重视,只有时刻知道自己家中的老人是否安全,子女才能在外面安心工作。而在老人独自在家面对的众多安全问题中,跌倒无疑是最为严重的之一,因为跌倒后不及时进行救治容易引起老人身体中隐藏的其他疾病,例如,高血压、心脏病、心肌梗塞等容易对人的生命安全产生威胁的疾病,因此社会上出现了许多对老人的跌倒状态进行自动检测的系统,总体分为两大类:基于穿戴式设备的自动跌倒识别系统和基于环境的自动跌倒识别系统[1]。
基于穿戴式设备的自动跌倒识别系统,即将检测设备穿戴或佩戴在身上,例如利用智能手机内的加速度传感器来设计动作识别系统、可连接穿戴设备的老人摔倒远程智能手机监护客户端,这一类设备拥有简单,错误率低的特点,但同时基于穿戴式设备的自动跌倒识别系统要将检测设备置于人体部位,传感器容易受到干扰,导致传感器不能将数据及时的上传,并且老人并不喜欢在身上附加一些物品等,这些问题也是基于穿戴式设备的自动跌倒识别系统所面临的问题。
基于上面的情况,基于环境的自动跌倒识别系统也成为了当今社会的潮流,其中,基于机器视觉的自动跌倒识别系统便是其中最为突出的一个分支。而本文提出了一种改进过的基于日常生活经验的检测方案。目前,社会上比较先进的基于机器视觉的自动跌倒识别系统利用 kinect 的骨骼追踪技术,实时记录人的 6 个关节点的三维坐标,通过计算来获得人体的运动状态,准确率可达到 93% [2],这种系统的算法复杂,对于硬件的要求非常高,如果产生了环境噪声对于判断结果会有部分影响,因此,本文提出了以三帧差分算法为基础并对运动物体中心坐标波动阈值和上顶点到下顶点的高度差进行检测的方案,本文致力于解决硬件要求高和环境噪声对判断结果影响的问题。
本文所提出的设计中,摄像头所采用的芯片为 STM32H743VI,主频为 400 MHz,内存为 1 MB,帧缓冲区为 2 MB,支持 5 V 输入和 3.3 V 输出。另外,OpenMV4 H7 默认配置的 OV7725 感光元件处理 640
× 480 8-bit 灰度图或者 640 × 480 16-bit RGB565 彩色图像可以达到 60 FPS;当分辨率低于 320 × 240 可以
达到 120 FPS。大多数简单的算法可以运行 60 FPS 以上。
本文所提出的设计,致力于在硬件配置较低的情况下实现对老人跌倒状态的准确判断,因此,本文所提出的跌倒算法相对与传统的跌倒算法做出了改进,系统的总体工作流程如图 1 所示。
- 色彩模式的选择以及相机环境参数的设置
OpenMv 中提供了多种色彩模式,例如 RGB565、GRAYSCALE、BAYER,由于本文提出的设计需要能够高效、准确的处理图像,所以本文提出的设计采用 GRAYSCALE (灰度图)模式,因为灰度图像素点的变化只在 0~255 阶灰度范围内,在进行图像处理的过程中,只需要少部分的内存空间,大大节省对摄像头内部的帧缓冲区的资源消耗。
在目前的设计阶段,为了方便进行图像运算以及测试,分辨率选择的是 320 × 240,同时为了保证图像运算的可靠性,在本设计中关闭了摄像头自动的白平衡与自动增益,下面是色彩模式的选择与相机环境参数设置的部分代码:
sensor.reset () #将摄像头的所有属性重置。
sensor.set_pixformat (sensor.GRAYSCALE) #GRAYSCALE(灰度图)。 sensor.set_framesize (sensor.QVGA) #视频分辨率 320 × 240。 sensor.skip_frames (time = 2000) #跳过不稳定帧,2000 ms。 sensor.set_auto_whitebal (False) #白平衡关闭。
sensor.set_auto_gain (False) #自动增益关闭。 clock = time.clock () #记录摄像头运行时间。
能够进行运动检测的算法有很多种,相邻帧间差分算法和三帧间差分是最为高效和可靠的[3]。两种算法都具有良好的实时性,但在相邻帧间差分算法进行运动检测时,如果光线产生了变化,那么相邻帧间差分算法就会产生一定的误差,而三帧差分算法是将第一帧和第二帧进行差分运算后的结果与第二帧和第三帧进行差分运算后的结果进行“与”运算,相比于相邻帧间差分算法,这种算法增强了对于运动物体双边的检测,在老人跌倒的瞬间,能够做出准确的判断,因此本文在设计时,通过三帧间差分算法来检测老人的运动状态。
在对摄像头捕捉的画面进行三帧间差分的运算后,在帧缓冲区中并不能很好的将运算后的结果显性的表示出来,因此在这里需要对图像进行二值化分割,方便能够将运算结果显性的显示出来,并进行后面的图像运算。
在帧缓冲区中,灰度图的差值运算会将帧与帧之间相同与不同的色阶用 0 和 1 表示出来,因此,在这里,需要将图像运算后得到的不同的色阶作为分割阈值进行二值化分割[4],黑色为 0,白色为 1,二值化分割的效果图如图 2 所示。
下面是二值化分割的部分代码:
GRAYSCALE_thresholds = (25, 255) #图像进行差值运算后,不同部分色阶的阈值。
img.binary ([GRAYSCALE_thresholds], invert = 0) #按照给定的阈值,对运算后的图像进行二值化分割。
在图像的处理过程中,会有很多因素对图像的运算结果产生影响,例如光线强度、物体的运动速度、设备本身的质量问题等,而这些因素在加入了图像的运算过程后,会使图像上产生“花斑”,这样对物体运动状态的判断就会产生较大的误差,因此本设计中对图像加入了降噪处理。
降噪之后,图像中由二值化显示出来的图像差值会变得很微弱[5],会在检测的过程中自动给忽略掉,很难检测到所需检测的运动物体,而对降噪之后的图像对象进行膨胀处理[6],会让图像的差值部分变大,方便图像后期的运算,降噪后效果图如图 3 经过降噪以及膨胀处理之后的效果图所示,腐蚀后膨胀得到的像素点变大。
reductionon tret
图 3. 经过降噪以及膨胀处理之后的效果图
下面是进行降噪和膨胀处理的部分代码:
for i in range (10): #对运算后的图像进行侵蚀(降噪)运算。
img.erode (2, threshold = 5) #侵蚀函数,需要给定噪声大小与颜色的阈值。
img.dilate (1) #膨胀函数,将降噪后的像素点膨胀。
上面的图像运算会在老人出现在摄像头中后,以二值化显示出来,而老人在二值化构成的图像中则是由值为 1 的像素点构成,在这里,通过摄像头内置的 find_blob 函数将值为 1 构成的最大的集合框起来作为运动对象的主体,然后调用色块对象返回运动主体的中心坐标,通过设置中心坐标的波动范围来判断老人的跌倒状态,设置跌倒标志位 flag,当值为 0 时返回 FALSE,值为 1 时返回 True,为了节省帧缓冲区的内存空间,在这里不新建一个新的矩形对象,而是直接通过色块对象返回运动主体的中心坐标进行判断。跌倒检测代码片段如图 4 所示。
图 4. 跌倒检测代码片段
测试阶段,我们用 OpenMv IDE 进行仿真测试,用串行终端将结果输出。
当老人处于静止状态时,串行终端会一直输出正常状态 0。当老人处于静止状态时,串行终端的输出结果如图 5 所示。
当老人处于非静止状态时,程序会对老人实时的状态进行判断,串行终端会输出老人的运动时的中
心坐标和跌倒标志 flag,如果小于设置的阈值则输出正常状态 0,大于阈值则输出跌倒状态 1。当老人处于非静止状态时,串行终端对老人实时状态的输出如图 6 所示。
图 5. 当老人处于静止状态时,串行终端的输出结果
图 6. 当老人处于非静止状态时,串行终端对老人实时状态的输出
最后,我们利用了摄像头进行了实地测试,图 7 和图 8 分别对人的站立状态和跌倒状态进行了判断。
我们一共进行了 10 组不同速率的跌倒测试,从下面的 10 组测试结果中(表 1),我们得到我们的检测正确率大约在 80%左右,对于高速率的跌倒(不考虑老人快速跑动的情况下),能够准确的检测出来,在硬件方面,内存使用率在 1 MB 以内,在连接电脑的情况下 FPS 稳定在 40 帧左右(若是脱机运行,能够达到 70 帧)。因此本文所提出的设计相对于市面上比较高级的算法来说,对于硬件的要求不高,所以可以在家中布置多个摄像头进行联合监控,这样可以大大提高跌倒状态的检测成功率。
表 1. 不同速率的跌倒状态下的检测结果
实验次数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
跌倒速率 | 缓慢 | 缓慢 | 缓慢 | 缓慢 | 缓慢 | 快速 | 快速 | 快速 | 快速 | 快速 |
检测结果 | 跌倒 | 正常 | 正常 | 跌倒 | 跌倒 | 跌倒 | 跌倒 | 跌倒 | 跌倒 | 跌倒 |
社会在进步,认知在提高,人们对于家中老人的身体健康越来越重视,只有家中的老人身体健康、安全无忧,那么子女才能安心的在外工作。老人在家中面临的所有危险中,跌倒无疑是对老人身体安全构成威胁的最主要因素之一,除了因为跌倒而导致的受伤之外,还容易引起其他的容易发生的事故和疾病,例如燃气泄漏以及身上的隐疾,因此本文提出了这种跌倒检测模式,能够快速的对老人发生的跌倒做出第一时间的反应,并且本身所需成本不高,能够应用于绝大多数场合。