時隔兩個多月了,前段時間在弄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