时隔两个多月了,前段时间在弄Socket,就没有弄这个了。现在好了,花了几天的时间,终于又完成了一小部分了。这一小节主要讲α,β,δ,θ等等波段之间的关系。废话不多说,直接给出这几天的成果。
上一次,我们分析了attention(专注度)和meditation(冥想度)与疲劳之间的关系。如下图
上面的曲线上一小节已经简单说明了,现在要说明的是曲线的前半部分是普通测试,后面一小段两对线有点分离的部分是模拟闭眼休息状态,全身放轻松。从图中可以看出是否精神集中从专注度和冥想度是可以简单的看出来了。
接下来就是那另外的波段了。这里只列举有影响的几个波段组合。
alpha/beta
low-alpha/theta
alpha% (alpha波段占全部波段的百分比)
attention/meditation
我们以第一个alpha/beta为例,我们可以看出里面有一些点是噪点。差不多就是在601处。我们去除大于20的点,结果得到下面的图。
现在这样就差不多了,对上面的其他两个都进行这样的处理,除噪后。得到的这样的图像,这种图像是不是以前见过呢?没错就是在第四小节,那一节已经讲了怎么处理了,这个还是使用同样的办法进行处理。就会得到一条曲线。得到曲线后我们可以分析上面提供的关系图像。在这里说明一下,上面的所有图像都是采用同一组测试数据进行绘图的。都可以看出在570秒处,所有的数值都会有一点点的上升趋势。而在那段上升的时间刚好是我们处于休息放松的状态呢!
从这几个波段关系还有专注度冥想度都分析完了,接下来就是从这些数据得到一个具体的疲劳值。下面这些都是自己定义的。可能根据不同的硬件获取到的比值会有些许的不一样。具体应用还要修改一些参数。我的硬件得到的数据参数是如下:
1 double FatigueDetection::FD_getValue() 2 { 3 //经测试 alpha% low-a/theta low-a/beta 的取值区间为0~100 0:清醒 100:疲劳 20:一般 4 //meditation/attention 的取值大约在 0.6~1.8之间 0.6表示清醒 5 //meditation冥想度越高表示越疲劳 6 //attention专注度越高表示越专注,越清醒 7 double result=0.0; 8 result=(avg.alpha+avg.alphatheta+avg.alphabeta)/3*(((avg.meddivatt-1)/3)+1); 9 fatiguevalue=result; 10 return result; 11 }
什么的那个公式没有什么具体的含义,就是简单的加权求值而已。最后得到的疲劳值画图如下:
我们可以看到我使用的硬件产生后的数值都落在中间一部分,区分度不是很大,我这里想到的解决方案是采用图像处理中增强对比度的指数变换的方法来增强数值的区分度。
还有另外的一个方法是使用KNN算法。大概的思路是采用上面提到的几个指标来进行分类显示的。(这两个处理办法不知道下次是什么时候讲解了)
这几天还对以前的代码进行封装,成为一个类,方便调用。
1 class FatigueDetection 2 { 3 public: 4 FatigueDetection(int vsize); 5 void FD_setValue(int at,int me,int de,int th,int al1,int al2,int be1,int be2,int ga1,int ga2); 6 void FD_setValue(struct FD_DATA); 7 void FD_setValue(int array[10]); 8 void FD_ActiveWindow(struct FD_DATA data); 9 void FD_Compensation(struct FD_DATA data); 10 void FD_Pretreatment(struct FD_DATA data);//预处理 11 void FD_PrintDebugMessage(FILE * fd); 12 //int FD_KNN();//对几个指标进行KNN处理 13 //如果getvalue的值的曲线分布过于集中的话,可以使用图像处理中的增强对比度方法 14 double FD_getValue();//返回一个0-100的整数 15 private: 16 struct FD_DATA_DO avg;//用于滑动窗口 17 struct FD_DATA_DO sum;//用于滑动窗口 18 double attention; 19 double meditation; 20 int size;//滑动窗口的长度,也即个数 21 int window;//当前可用的滑动窗口个数 22 vector<struct FD_DATA_DO> vdatado; 23 int id;//表示已经处理数据的总个数 24 double fatiguevalue;//最后得到的疲劳值 25 };
不知道以前有没有说过,我这个算法目前是想解决这样的一个问题---检测驾驶员的疲劳状态,我们知道驾驶员有时候会疲劳驾驶,而这样是极其危险的。而我们又不能清楚的知道该人是否是疲劳的。当然连续的打哈欠我们是知道的。而脑电波这种数据是很难自己控制的。所以用来检测驾驶员是否疲劳还是很有用的。但处于疲劳时可以给出提醒。我现在在做的这个是有其他人负责android端的。然后使用者是带着前面给出的那种耳机。通过蓝牙发送信息,一旦检测到疲劳,根据不同的程度,手机给出不同的提示。我做的这个是一方面,如果加个现在流行的什么智能手环。得到心跳血压等等其他的生理特征的数据,然后加以分析,计算疲劳值,多个指标进行互补,提高准确性。我觉得对于预防疲劳驾驶而导致的危害有很大的帮助。
本文地址:http://www.cnblogs.com/wunaozai/p/3923649.html
各小节传送门:
基于mindwave脑电波进行疲劳检测算法的设计(1)
http://www.cnblogs.com/wunaozai/p/3677501.html
基于mindwave脑电波进行疲劳检测算法的设计(2)
http://www.cnblogs.com/wunaozai/p/3677554.html
基于mindwave脑电波进行疲劳检测算法的设计(3)
http://www.cnblogs.com/wunaozai/p/3678125.html
基于mindwave脑电波进行疲劳检测算法的设计(4)
http://www.cnblogs.com/wunaozai/p/3766779.html
基于mindwave脑电波进行疲劳检测算法的设计(5)
http://www.cnblogs.com/wunaozai/p/3923649.html