APP下载

使用Android手机摄像头的脉搏测量软件设计

2016-06-01陈林军刘鹏陈鹏

单片机与嵌入式系统应用 2016年3期
关键词:软件设计脉搏摄像头

陈林军,刘鹏,2,陈鹏

(1.后勤工程学院 后勤信息工程系,重庆 401311;2.重庆通信学院)



使用Android手机摄像头的脉搏测量软件设计

陈林军1,刘鹏1,2,陈鹏1

(1.后勤工程学院 后勤信息工程系,重庆 401311;2.重庆通信学院)

摘要:为充分利用智能手机已有的硬件资源,为人们生活带来便利,设计了基于Android手机摄像头的脉搏测量软件。首先,分析了利用手机摄像头测量脉搏的原理;然后,分别设计了软件的数据采集模块、数据处理模块和显示控制模块;最后,完成了软件的综合集成。实测结果表明,手机摄像头测量脉搏方案可行,测量结果满足一般监控要求。

关键词:Android手机;摄像头;脉搏;软件设计

引言

随着智能手机的普及,人们利用智能终端获取信息的能力和需求日益增加,手机上网、看书、玩游戏、记事等已经成为智能手机最基本的功能[1]。当前,智能手机均集成有摄像头、GPS芯片、陀螺仪等硬件设备,使得智能手机能够完成摄影[2]、定位导航[3]、跌倒检测[4]等功能。手机应用市场上有海量的应用软件,开发者利用这些智能手机的有限硬件资源,实现了很多有趣而实用的功能,使人们的生活变得更加方便。

本文设计了基于Android手机的脉搏测量应用软件,利用Android手机的摄像头获取指尖图像,图像的亮度包含了脉搏的跳动信息,通过数字信号处理算法,计算出每分钟脉搏跳动的次数,使每一个拥有Android手机的人都可以随时检测自己的脉搏,进而了解自己的健康状况。

1测量原理

脉搏有收缩和舒张两个过程,在脉搏收缩时,毛细血管充血,手指尖的毛细血管透光率下降;反之,在脉搏舒张时,手指尖的毛细血管透光率增强。这样,只要使用摄像头捕获图像,分析图像的综合亮度变化,就可以获得心率。

图1 摄像头测量脉搏步骤

具体做法如图1所示,指尖轻贴在摄像头上,用高亮度的光源(摄像头旁的LED闪光灯)照亮指尖皮下毛细血管,利用摄像头按照某一频率连续获取指尖图像,由于手机图像的颜色和亮度都是以数字形式采集和存储的,所以可通过数字信号处理方法计算出每一张图像的综合亮度,图像亮度按照脉搏跳动规律周期性变化,只需计算出亮度变化周期,就可以得到脉搏的搏动周期,进而得到每分钟脉搏跳动次数。

2需求分析

脉搏测量软件的开发,是为了利用人们普遍拥有的智能手机实现脉搏测量,使人们在任何地点都可以知道自己的心率,结合相关医学常识,随时掌握自身的健康状况。软件的功能需求如下:每分钟脉搏次数(心率)显示,这是脉搏测量软件最基本的功能,在UI界面中实时显示心率数值。

脉搏测量软件所要达到的性能如下:

① 测量精度。一般正常人的心率在60~100次/min,运动员平时心率在60次/min以下,普通人剧烈运动后心率在100次/min以上也是正常的,因此脉搏测量范围设置为30~180次/min,控制精度在5%以内,因此要求测量误差小于2次/min。

② 最小测量时间。这一指标表示达到精度要求所需要的最小时间,由于脉搏跳动周期接近1 s,而计算心率必须要采样多个周期才能减小误差,本设计设定最小测量时间为10 s。

③ 刷新时间。测量过程采用实时动态测量,要求心率的显示也随时间重新计算,两次显示时间间隔为刷新时间,本设计设定为1 s。

3软件设计

按照软件的功能和性能需求,将软件分为3大模块:数据采集模块、数据处理模块(心率提取模块)和显示控制模块[5]。本文先分别实现各功能模块,再进行3大功能模块的综合集成,设计统一的软件操作界面,完成软件的设计。

3.1数据采集模块的设计

数据采集模块要实现的功能是:打开手机摄像头,将预览图像显示到手机屏幕,同时获取每一帧预览图像的综合亮度。这里涉及到摄像头调用和屏幕显示预览两方面的设计。

摄像头的调用一般有两种方法[6]。一种是调用系统照相机,拍照后返回主activity图片数据,在主activity中添加数据接收方法,对返回的图形数据进行处理,这种方法虽然简单,但是不够灵活,不适用自定义的方法,可扩展性较差,不能满足本设计快速对指尖图像采样的要求。另一种方法是调用Android的Camera这个类来创建一个自定义的摄像机实例,这个类可以帮助我们调用手机的内置摄像头,并通过设置各种参数达到要求,比如图像大小、预览速率、图像方向等。

值得注意的是,摄像头的调用和闪光灯打开涉及到系统权限问题,必须在AndroidManifest.xml文件中对软件权限进行设置[7],其代码如下:

该模块利用SurfaceView来实现屏幕显示摄像头预览,通过SurfaceHolder链接视频活动和SurfaceView。创建预览通过以下4个步骤来完成。

① 在SurfaceCreated中获取Camera对象;

② 通过SurfaceHolder设置Camera的预览监听;

③ 调用StartPreview()方法,启动摄像头预览;

④ 在SurfaceDestroyed中当控件销毁时,关闭摄像头预览,并释放资源。

以上步骤的关键代码如下:

mySurfaceHolder = mySurfaceView.getHolder();

mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

mySurfaceHolder.addCallback(this);

public void surfaceCreated(SurfaceHolder holder) {

camera = Camera.open();

camera.setPreviewDisplay(holder);

camera.startPreview();

}

public void surfaceDestroyed(SurfaceHolder holder) {

camera.stopPreview();

camera.release();

}

在图像预览功能完成后,就需要对预览数据进行采集,在摄像头参数设置时将预览格式设置为YUV422格式:

parameters.setPreviewFormat(ImageFormat.NV21);

YUV格式的视频信号只需占用极少的频宽(8位)。其中“Y”(4位)表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”(各2位)表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。本设计只需利用Y(明亮度)值即可,将每一帧图像的所有点的亮度值求和记为该图的综合亮度,将其保存在数组中供其他模块使用。亮度提取代码如下:

@Override

public void onPreviewFrame(byte[] data,Camera camera) {

byte yuvData;

int sum,y;

sum=0;

for (int ii=0;ii

for (int jj=0;jj

yuvData = data[ii*iPreviewWidth+jj];

y = (0xf0 & (int)yuvData)>>4;

sum+=y;

}

dValue[iCount]=sum;

}

代码中的dValue[]为给定数组,存储的是包含有脉搏信息的综合亮度值,dValue[]中的数据为预览图像的综合亮度值。该模块设计完成后,编写成单一功能软件安装在华为Ascend P6手机中,经过测试,能够成功打开后置摄像头和LED闪光灯。

3.2数据处理模块

数据处理模块即心率提取模块,就是将数据采集模块中采集的综合亮度数据,通过数字信号处理的方法求出亮度变化频率,频率乘以60即为心率。

考虑到脉搏搏动的周期性,采样数据也是呈周期性变化,因此本文采用FFT法进行频率提取。数据处理模块主要分为3步,即复数类的编写、基于基-2抽取的快速傅里叶变换(FFT),以及频谱峰值搜索并转化为频率值。由于Java不支持复数运算,因此本文编写复数类,利用实数运算实现复数运算;基于基-2抽取的快速傅里叶变换也是通过类的方法编写,在类中创建了fft()方法,输入参数为数组(dValue),输出为傅里叶变换后的幅值(与输入等长的数组);频谱峰值搜索,即是通过搜索FFT输出的数组中的峰值的位置,利用公式f=kfs/N得到频率。其部分代码如下:

double[] fftResult=new FFT().fft(dValue);

for (int i=iBegin;i

if (fftResult[i]>maxValue){

maxValue = fftResult[i];

iFreq = i;

}

}

heartRate =(int)(60.0*30.0*iFreq/point);

if(heartRate>40 && heartRate<120)

txv2.setText(String.format("心率:%d",heartRate));

为验证程序的正确性,设置dValue[]={1,-1,1,-1,2,1,1,2},经过FFT变换后结果为{6.0000,3.5476,1.4142,3.9261,4.0000,3.9261,1.4142,3.5476},与Matlab计算结果一致,证明该模块中数据处理模块设计正确。

3.3显示控制模块

显示控制模块实现的是人机交互功能,该模块设置有操作指南、测试按键和心率显示控件,为了让脉搏搏动过程更为直观,还设置了波形显示区域,将综合亮度用曲线在手机屏幕上显示出来。

本设计中,使用Canvas组件表示屏幕上一个空白矩形区域,当Canvas对象调用paint()时就会在该容器中画图。调用drawLine()方法将两个点之间用直线连接起来,波形图就是利用给定数组的数据将其转化为屏幕位置作为纵坐标,横坐标由数组序号得到。波形显示模块先绘制显示的矩形区域和Y=0的直线,然后绘制波形图。代码如下:

canvas.drawLine(X_OFFSET,40+centerY,WIDTH+X_OFFSET,40+centerY,paint);

canvas.drawLine(X_OFFSET,40,WIDTH+X_OFFSET,40,paint);

canvas.drawLine(X_OFFSET,456,WIDTH+X_OFFSET,456,paint);

canvas.drawLine(X_OFFSET,40,X_OFFSET,HEIGHT+40,paint);

canvas.drawLine(X_OFFSET+WIDTH,40,X_OFFSET+WIDTH,HEIGHT+40,paint);

for(int i=1;i

}

这里的dValue为给定数组,在综合集成时,Value中的数据为预览图像的综合亮度值。设计完成后,用华为Ascend P6手机进行测试,能够满足设计要求。

3.4综合设计

本文分别对脉搏测量的3大功能模块进行了编程调试并达到了预期功能,然后将对3大模块进行整合,将3个模块进行综合,设计完整的脉搏测量软件。按照需求分析中的要求,完成脉搏测量软件的设计。软件的流程图如图2所示。

图2中,数据采集数组长度设置为256,采集完成表示数组中已经保存了256次预览的综合亮度值;滑动30点表示将数组前30点舍弃并将后面的点依次前移30个点,这样,数组后30个地址重新采样保存直到再一次采集完成再进行下一次FFT运算。由设置手机预览速率为30帧/s,所以采集30帧图像的时间为1 s,因此波形和心率显示刷新时间和为1 s。

通过布局文件,设计如图3所示的软件UI界面。界面中的提示部分介绍软件的使用方法,以减小由于操作不当导致的测量误差;SurfaceView中显示的是摄像头预览图像;TextView在运行时将显示每分钟脉搏搏动次数(心率);下面部分空白处将显示由预览图像亮度得到的波形图,可以直观地看到脉搏的搏动情况;波形显示区域下方是一个按钮,控制脉搏测量的开始和停止。

图2 脉搏测量软件流程图

图3 软件UI界面

4测试结果及分析

将软件安装在华为Ascend P6手机进行测试。打开软件,屏幕最上方有两行文字提示,说明软件的使用方法;提示下方的预览区域可以看到通过摄像头的预览图像;预览区域下方显示的心率为零;心率显示区域下方为波形显示区域,在没有点击“开始测试”按钮时保持空白。

图4 测量过程

按照提示,将指尖轻贴摄像头上并保持不动,点击“开始测试”按钮,软件打开LED闪光灯,测试过程开始,运行约10 s后,心率显示更新为测试所得心率,波形显示区域显示脉搏的搏动情况,按钮文字变为“正在测试……”,图4为测试过程的截图。再次点击按钮,LED闪光灯关闭,心率显示和波形图保持不变,直到再次开始测试才重新刷新。

利用本文设计的软件分别对5人进行测试,测试结果如表1所列。由表1可知,本文所设计的软件与手动号脉所得的结果基本一致,误差最大为在±2次/min,满足设计性能要求。

表1 不同方法结果对比

结语

本文分析了利用手机测脉搏的原理,分模块设计了软件的数据采集模块、数据处理模块(心率提取模块)和显示控制模块,测试通过后进行综合集成,完成了脉搏测量软件的设计和实现。测试结果表明,该软件能够利用安卓手机的摄像头进行脉搏测试,测试误差在±2次/min以内,能够满足设计要求。

参考文献

[1] 何璇. 基于Java语言的安卓手机软件开发[J].计算机光盘软件与应用,2014(8): 67-68.

[2] 周波.手机摄影软件界面设计研究[D].武汉: 湖北工业大学,2013.

[3] 林志鹏,余代俊,张博.基于安卓手机的GPS控制网测量记录软件开发[J].地理信息世界,2013,20(4): 65-69.

[4] 吴志强,曹蕾,王凯,等.基于智能手机的人体跌倒检测系统设计[J].计算机工程与设计,2014,35(4): 1465-1470.

[5] 饶曦.基于Android平台的聚会助手软件的实现过程[J].郧阳师范高等专科学校学报,2014,34(3): 7-14.

[6] Nicolas Gramlich.Android编程入门教程[EB/OL].(2009-5) [2015-10].http://www.anddev.org/.

[7] Android 2.3 User’s Guide[EB/OL].(2010-12) [2015-10].http://www.google.com.

陈林军、陈鹏(硕士研究生),主要研究方向为智能检测与智能控制;刘鹏(讲师),主要研究方向为嵌入式控制系统。

End Sub

Sub Button3_Click

‘关灯

buffer(0)=1

buffer(1)=0

OutputStream1.WriteBytes(buffer,0,2)

‘将关灯控制代码数据(必须是数值型)写入输出管道流

Button3.Enabled=False

Button2.Enabled=True

End Sub

结语

本文采用51单片机WiFi模块和Basic4Android开发平台实现智能手机与51单片机进行数据通信,从而实现智能手机远程控制单片机及外围设备的功能。通过文中实例可以明显看出,采用Basic4Android开发平台简洁、易上手,使手机APP编程难度降低,为嵌入式系统设计工程师快速进行物联网开发提供参考。

[1] 红心物联科技公司.M02串口wifi模块相关基础知识,2015.

[2] Basic4Android开发教程[EB/OL].[2015-10].http://www.Basic4Android.com.

[3] 谢扬,潘子豪.易安卓开发平台可视化界面在智能家居领域的应用[J].单片机与嵌入式系统应用,2015(9):14-17.

(责任编辑:薛士然收修改稿日期:2015-10-23)

Pulse Measurement Software Based on Android Mobile Phone Camera

Chen Linjun1,Liu Peng1,2,Chen Peng1

(1.Department of Information Engineering,Logistical Engineering University,Chongqing 401311,China;2.Chongqing Communication Institute)

Abstract:To make full use of the existing hardware resources of the smart phone and make people’s life more convenience,the software of pulse measurement based on Android mobile phone camera is designed.Firstly,the principle of measuring the pulse with the mobile phone camera is analyzed.Then,the data acquisition module,the data processing module and the display module are designed respectively.Finally,the integration of the softwares is completed.The measured results show that the design scheme is feasible,and the results meet the requirements.

Key words:Android mobile phone;camera;pulse;software design

收稿日期:(责任编辑:杨迪娜2015-10-21)

中图分类号:TP319

文献标识码:A

猜你喜欢

软件设计脉搏摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
用心感受狗狗的脉搏
《今日评说》评今日浙江 说时代脉搏
光电式脉搏波检测系统的研究
基于51系列单片机的穿戴式脉搏仪的设计
基于STM8S903K3的序列打螺丝夹具的软件设计
一种VHDL语言代码重用的方法
奔驰360°摄像头系统介绍
找出摄像头花屏的“罪魁祸首”