极速赛车APP下载

心跳之旅——iOS用电脑检测心率(PPG)

电脑杂谈  发布时间:2019-08-31 20:09:48  来源:网络整理

a7m2 摩尔纹_ps摩尔纹怎么处理_去摩尔纹软件 ios

转载于

[前情提要] 光阴似箭,日月如梭,最近几年,支持心率监测的设备日益常见了,大家都在诸多测空气测雪碧的,如火如荼,于是我也来凑一凑热闹。[0]

这段时间,我完成了一个基于iOS的心率监测Demo,只要稳定地用手掌按住电脑,它能够采集你的心率数据。Demo完成后,我对心率监测模块进行了封装,并提供了默认和音效,能够更加便捷导入到其它项目中。在这篇博客里,我将向你们分享一下我完成心率测试的过程,以及,期间我见到的种种困难。

在起初之前,我先为你们展现一下最后成品的效果:

心率检测的ViewController

上图展示的是心率监测过程中的主要界面。

在测试的过程中,应用无法即时捕获心跳的波峰,计算相应的心率,并以Delegate或Block的方式回调,在图标上显示相应的和音效。

好吧,其实里面的前情提要都是我扯淡的,这个Demo是我来到公司的第一天接到的任务。刚接到任务的之后虽然是有点懵逼的,原本以为刚入职三天可能都是要说说文档,或者拖拖控件,写写界面哪个的,结果Xcode都还没装好,突然接到一个心率检测的任务,顿时压力就大出来了,赶紧拍拍脑袋出来找资料。

心率检测的APP在我高三左右就有了,我明白地记得当年,年少无知的我还误以为,大概又是什么刁民闲着无趣恶搞的流氓应用,特地下载出来试了一下,没想到居然真的能测。。。

总有刁民想害朕

当时就震惊地开启了某度查了这类应用的原理。所以今天找起资料来而是非常有方向性的。

花了两天的时间找资料,发现在电脑心率监测方面,网上相关的东西而是非常少。不过各种资料参考下去,基本的推动策略已然有了。

任务清单

首先说一说用电脑实现心率监测所用到的原理。

极速赛车APP下载我们了解,现在市面上有特别多具有心率监测功能的可穿戴设备,比如各类手环或者各式Watch,其实从本质上讲,我们现在要用到的原理跟那些可穿戴设备所用到的机理并无二致,它们都是基于光电容积脉搏波描记法(PhotoPlethysmoGraphy, PPG)。

iWatch的心率传感器发出的绿光

PPG是追踪可见光(通常为绿光)在身体组织中的反射。它具有一个可见光光源来照射脸部,再使用光电传感器采集被脸部反射出来的光线。PPG有两种方式,透射式和反射式,像通常的手环手表这样,光源和传感器在同右侧的,就是反射式;而医院中常用的夹在指尖上的一般是透射式的,即光源和传感器在不同侧。

去摩尔纹软件 ios_a7m2 摩尔纹_ps摩尔纹怎么处理

皮肤本来对光线的反射能力是相对稳固的,但是肝脏泵血并且神经容积周期性地差异,导致反射光也展现出周期性的波动值,特别是在指尖这种毛细血管非常丰富的部位,这种周期性的波动很容易被观察到。

使用iPhone的系统手机就可以随意地用肉眼观察到这些波动——在录像中开启闪光灯,然后用双手用力覆盖住,就能观察到满屏的蓝像会随着跳动形成一阵一阵的明暗差异,如下图(请忽略满屏的摩尔纹)。

直接用肉眼能够观察到镜头图像的明暗变化

至于,为什么可穿戴设备上用的光源大多数都是绿光,我们用电脑闪光灯的白光会不会有问题。这主要是因为绿光在心率监测中形成的信噪比比较大,有利于心率的测量,用白光只是完全没问题的。详情可以移步知乎:各种智能穿戴的心率监测功能 。我在这里就不细说了。

我们已经了解我们应该用闪光灯和来充当PPG的光源和传感器,那么后面就来预测一下后续整体的方案。下面是我收集完数据以后大概画出的一个流程图。

整体思路

首先我们应该收集相机的数据,这一步可以使用AVCapture;然后根据某些算法,对每一帧图像计算出一个相应的特征值并储存到函数中,算法可以考量取蓝色分量以及转化为HSV再计算;在受到一定量的数据后,我们对这个时间段内的数据进行预处理,譬如进行串扰,过滤掉一些噪音,可以参考一篇博客:巴特沃斯滤波器;接下来,就可以进行心率计算,这一步可能涉及到一些数字信号处理的内容,例如波峰检测,信号速率计算,可以使用Accelerate。Framework的vDSP处理框架,Accelerate框架的用法可以参考:StackOverFlow的一个回答(最终我并没有使用,原因前面会看到);最终就可以得到心率。

有了大约的方案以后,我决定着手进行推动了。

我们后面将要看到,我们要用AVCapture进行视频流的收集。在使用AVCapture的之后,需要先确立AVCaptureSession,相当于是一个传输流,用来联接数据的输入输出,然后分别创建输入和输出的联结。因此,为了变得直观,我先做了一个类似于相机的Demo,把AVCapture采集到的镜头图像直接传输到一个Layer上。

创建AVCaptureSession

AVCaptureSession的配置过程类似于一次事务的提交。开始配置前需要调用[_session beginConfiguration];来开始配置;完成所有的配置工作后,再读取[_session commitConfiguration];来提交此次配置。

因此,整个配置过程大概是这么的:

 /** 建立输入输出流 */
 _session = [AVCaptureSession new];
 /** 开始配置AVCaptureSession */
 [_session beginConfiguration];
 /*
  * 配置session
  * (建立输入输出流)
  * ...
  */
 /** 提交配置,建立流 */
 [_session commitConfiguration];
 /** 开始传输数据流 */
 [_session startRunning];       

建立输入流From Camera

要从相机建立输入流,就得先获得到照相机设备,并且对它进行相应的配置。这里对照相机的配置最关键的是要开启闪光灯常亮。此外,再设定一下白平衡、对焦等参数的锁定,来确保后续的测试过程中,不会因为相机的手动微调而造成特征值不稳定。

 /** 获取照相机设备并进行配置 */
 AVCaptureDevice *device = [self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];
 if ([device isTorchModeSupported:AVCaptureTorchModeOn]) {
     NSError *error = nil;
     /** 锁定设备以配置参数 */
     [device lockForConfiguration:&error];
     if (error) {
         return;
     }
     [device setTorchMode:AVCaptureTorchModeOn];
     [device unlockForConfiguration];//解锁
 }

需要注意的是,照相机Device的配置过程中,需要事先锁定它,锁定失败后才会进行配置。并且,在配置闪光灯等参数前,必须事先判断当前设备能否支持相应的闪光灯模式或其它用途,确保当前设备支持能够够进行修改。

此外,对于相机的配置去摩尔纹软件 ios,还有一点非常重要:记得调低闪光灯亮度!!

去摩尔纹软件 ios_a7m2 摩尔纹_ps摩尔纹怎么处理

长期打开闪光灯会促使电池发热,这对电池是一种伤害。在我调试的过程中,曾经无数次调着调着忘了闪光灯还没关,最后整只手机发烧到烫手的程度才看到,直接进化成小米~ 所以,尽量将闪光灯的亮度提高,经过我的检测,即使闪关灯亮度开到最小也无法测得清晰的心率。

接下来就是利用配置好的device创建输入流:

    /** 建立输入流 */
    NSError *error = nil;
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device
                                                                              error:&error];
    if (error) {
        NSLog(@"DeviceInput error:%@", error.localizedDescription);
        return;
    }

建立输出流To AVCaptureVideoDataOutput

建立输出流应该用到AVCaptureVideoDataOutput类。我们应该建立一个AVCaptureVideoDataOutput类并修改它的像素输出格式为32位的BGRA格式,这其实是iPhone相机的原始格式(经@熊皮皮提出,除了这些格式,还有两种YUV的格式)。后续我们调用图像Buffer中的像素时,也是根据这个排序(BGRA)去抓取像素点的数据。设置中应该用一个NSDictionary来成为参数。

我们需要修改AVCaptureVideoDataOutput的代理,并建立一个新的线程(FIFO)来给输出流运行。

 /** 建立输出流 */
 AVCaptureVideoDataOutput *videoDataOutput = [AVCaptureVideoDataOutput new];
 NSNumber *BGRA32PixelFormat = [NSNumber numberWithInt:kCVPixelFormatType_32BGRA];
 NSDictionary *rgbOutputSetting;
 rgbOutputSetting = [NSDictionary dictionaryWithObject:BGRA32PixelFormat
                                                forKey:(id)kCVPixelBufferPixelFormatTypeKey];
 [videoDataOutput setVideoSettings:rgbOutputSetting];    // 设置像素输出格式
 [videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // 抛弃延迟的帧
 dispatch_queue_t videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
 [videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];

连接到AVCaptureSession

建立完输入输出流,就要将他们和AVCaptureSession连接起来啦!

极速赛车APP下载这里应该切记的是,必须先判定是否还能添加,再进行添加操作,如下所示。

 if ([_session canAddInput:deviceInput])
     [_session addInput:deviceInput];
 if ([_session canAddOutput:videoDataOutput])
     [_session addOutput:videoDataOutput];

实现代理协议的方式,获取视频帧

上面的方法中,我们将self设为AVCaptureVideoDataOutput的delegate,那么今天我们还要在self中实现AVCaptureVideoDataOutputSampleBufferDelegate的方法xxx didOutputSampleBuffer xxx,这样在视频帧到达的之后我们能够够在这个办法中获得到它。

 #pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate & Algorithm
 - (void)captureOutput:(AVCaptureOutput *)captureOutput
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
     fromConnection:(AVCaptureConnection *)connection {
     /** 读取图像Buffer */
     CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
     //
     // 我们可以在这里
     // 计算这一帧的
     // 特征值。。。
     //
     /** 转成位图以便绘制到Layer上 */
     CGImageRef quartzImage = CGBitmapContextCreateImage(context);
     /** 绘图到Layer上 */
     id renderedImage = CFBridgingRelease(quartzImage);
     dispatch_async(dispatch_get_main_queue(), ^(void) {
         [CATransaction setDisableActions:YES];
         [CATransaction begin];
         _imageLayer.contents = renderedImage;
         [CATransaction commit];
     });
 }


本文来自电脑杂谈,转载请注明本文网址:
http://www.0531mai.com/a/shumachanpin/article-121242-1.html

发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

  • 董润
    董润

    那就是具有单身未婚的女青年的身份

  • 吴徳
    吴徳

    希望在以后能够继续专注我的作品

  • 郭强强
    郭强强

    让这种无良商家自生自灭吧

极速赛车APP 极速赛车APP下载 极速赛车手机官网 极速赛车APP下载 极速赛车手机版下载 极速赛车双面盘 极速赛车APP 极速赛车手机官网 极速赛车APP下载 极速赛车手机官网