陸仲達,王麗婧,韓運起
(齊齊哈爾大學計算機與控制工程學院,黑龍江齊齊哈爾161000)
疲勞駕駛是當今交通安全的重要隱患之一。據(jù)統(tǒng)計,全世界每年因交通事故導致死亡的人數(shù)達60萬,直接經(jīng)濟損失約125億美元,這些事故中57%的災難性事故與駕駛員疲勞駕駛有關。駕駛員工作性質(zhì)特殊性、工作環(huán)境、道路環(huán)境、天氣狀況,以及受利益驅(qū)使,諸多原因下,越來越多的人出現(xiàn)疲勞駕駛[1]。駕駛員產(chǎn)生疲勞后,隨著生理機能下降,身體就會有一定的體現(xiàn),例如眼瞼下垂、低頭、瞌睡、動作緩慢等,這些都可以作為身體疲勞的特征變量[2]。目前的疲勞檢測主要是基于檢測駕駛員生理信號、駕駛員生理反應特征、駕駛員操作行為和車輛狀態(tài)信息等方法[3]。本文通過判斷眼睛的閉合程度來檢測駕駛員的疲勞狀態(tài),是基于駕駛員生理反應特征的疲勞檢測系統(tǒng)。
疲勞狀態(tài)的判定需要從兩個方面考慮,一是通過眼睛的閉合程度來獲得的駕駛員處于疲勞界限;二是在規(guī)定時間內(nèi)多次檢測所獲得的駕駛員處于疲勞狀態(tài)時間的長短[4]。
在駕駛員處于疲勞界限的判斷中,系統(tǒng)選擇攝像頭來采集駕駛員的臉部圖像信息傳遞給主控芯片,由圖像信息獲取駕駛員眼睛閉合程度。先將攝像頭采集到的駕駛員面部圖像與眼部分類器做比較,然后在合適的區(qū)域提取眼部圖像,進行灰度處理轉(zhuǎn)換成灰度圖,并對灰度圖進行水平直方圖計算,由此得到一個能描述駕駛員眼睛閉合狀態(tài)的數(shù)值。通過PERCLOS算法處理檢測信號并以此來判斷駕駛員的疲勞狀態(tài)[5]。疲勞狀態(tài)的表征為0~1之間的數(shù),1表示駕駛員的眼睛完全睜開,0表示駕駛員的眼睛完全閉合。當值小于0.2時就表示駕駛員已經(jīng)處于疲勞狀態(tài)。針對如何確定駕駛員處于疲勞狀態(tài)時間的長短,由研究結果得知,一般情況下人們眼睛閉合的時間在0.2~0.3 s之間,駕駛時若眼睛閉合時間達到0.5 s就很容易發(fā)生交通事故。為排除駕駛員眨眼而造成的誤檢,在系統(tǒng)運行時每隔100 ms取一幀圖像數(shù)據(jù)處理,若是連續(xù)5次都檢測到駕駛員都處于疲勞狀態(tài)時就可認為此事駕駛員正在疲勞駕駛。當以上兩個因素同時出現(xiàn)時,則說明駕駛員處于疲勞狀態(tài),應立即開啟聲光報警信號。
系統(tǒng)的硬件組成包括5個部分,分別是:主控芯片、電源電路、傳感器電路、存儲器電路和報警電路。系統(tǒng)基本原理框圖如圖1所示。
圖1 系統(tǒng)原理框圖
系統(tǒng)的主控芯片采用三星公司的S3C2440芯片,此款32位微處理器,其處理器是一個由Advanced RISC Machines公司設計的16/32位的使用ARM920T內(nèi)核的RISC處理器,能為手持移動設備和其他類型的應用設備提供低功耗、高性能的解決方案。采用專用的5 V穩(wěn)壓電源供電,輸入AC 100~240 V,50/60 Hz;穩(wěn)壓輸出5 V,2 A;能滿足系統(tǒng)的供電要求。5 V電源電路如圖2所示。
圖2 5 V電源電路
圖像采集傳感器使用通用的USB攝像頭,系統(tǒng)中使用的是一款HUAERTE攝像頭,采集的圖像分辨率為320×240,圖像格式RGB24,圖片壓縮格式bmp,支持USB2.0,數(shù)據(jù)傳輸速率最大可達246 Mbit/s。信號線連接于S3C2440的DNO和DP0兩個引腳。USB攝像頭與S3C2440的連接電路如圖3所示。
圖3 USB攝像頭與S3C2440的連接電路圖
存儲電路包括SDRAM存儲電路和 FLASH存儲系統(tǒng)電路。SDRAM存儲電路采用2片32 Mbyte的SDRAM芯片K4S561632C-TC75作為系統(tǒng)內(nèi)存,2片SDRAM芯片并接在一起形成32 bit的總線數(shù)據(jù)寬度;FLASH存儲系統(tǒng)電路采用Nor FLASH芯片AM29LV160DB作為系統(tǒng)的FLASH存儲系統(tǒng)。
系統(tǒng)采用聲光報警電路,當檢測到駕駛員正處于疲勞狀態(tài)時,發(fā)出聲光報警信號,驅(qū)動蜂鳴器和發(fā)光二極管使得蜂鳴器發(fā)出尖銳的響聲,發(fā)光二極管閃爍,以此來警示駕駛員此刻正處于疲勞駕駛狀態(tài)。聲光報警電路如圖4所示。
圖4 聲光報警電路圖
系統(tǒng)程序是基于OpenCV和C語言編寫的,系統(tǒng)利用OpenCV提供的大量的計算機視覺庫函數(shù)來實現(xiàn)底層驅(qū)動,再由C語言完成系統(tǒng)的程序框架[6]。
PERCLOS是在一定時間內(nèi)眼睛閉合時間所占的百分比。PERCLOS實驗測量方法主要有EM,P70,P80 3種,分別表示眼睛的眼瞼遮蓋蓋過瞳孔的面積超過50%的時候所占的時間的百分比;其中P80是被最為廣泛接受的一種疲勞檢測標準[7]。PERCLOS疲勞檢測原理如圖5所示。
在PERCLOS測量原理圖中,t1表示眼睛從完全睜開到閉合到20%的時間,t2表示眼睛從完全睜開到閉合到80%的時間,t3為眼睛從完全睜開到下一次睜開到20%所用的時間,t4為眼睛從完全睜開到下一次睜開80%所用的時間。通過測量t1,t2,t3,t4的值就可以很容易地求得疲勞系數(shù),具體計算公式為
圖5 PERCLOS測量原理圖
PERCLOS參數(shù)大于80%,則就認定此刻駕駛員正處在疲勞狀態(tài)。
系統(tǒng)程序采用PERCLOS作為疲勞檢測標準,計算所得的PERCLOS參數(shù)超過系統(tǒng)所設定的疲勞檢測閾值時即斷定駕駛員在疲勞狀態(tài)。疲勞檢測過程要求系統(tǒng)能實時處理攝像頭采集到得駕駛員的面部圖像,并迅速對處理結果做出相應的反應。因此對所使用的OpenCV代碼做相應的修改,在不改變原本函數(shù)功能的基礎上力求做到代碼最精簡,執(zhí)行效率最高,系統(tǒng)運行安全穩(wěn)定。在設計中,系統(tǒng)從采集到處理完畢一幀圖像數(shù)據(jù)所用時間小于100 ms,能滿足實時檢測的要求。疲勞檢測程序流程圖如6所示。
圖6 疲勞檢測程序流程圖
攝像頭驅(qū)動程序函數(shù)函數(shù)封裝到函數(shù)CvCapture*cvCreateCameraCapture(intindex)中。當調(diào)用函數(shù)時,OpenCV會自動打開函數(shù)參數(shù)(index)指定的攝像頭,并從攝像頭中讀取視頻信息。如果攝像頭初始化成功后捕獲到了駕駛員的面部圖像,函數(shù)就會返回一個指向已經(jīng)初始化了的CvCapture指針。如果攝像頭初始化不成功,該函數(shù)就會返回一個NULL指針。
當系統(tǒng)中同時安裝了多個攝像頭時,可以用identifier來指定系統(tǒng)所需要使用的攝像頭,以便告知系統(tǒng)怎樣與攝像機相交互。當系統(tǒng)中只有一個攝像機時,identifier要設為0。當系統(tǒng)調(diào)用cvCreateCameraCapture(int index)函數(shù)時,要將identifier參數(shù)與攝像機捕捉常數(shù)送給cvCreateCameraCapture(int index)函數(shù)的參數(shù)index。系統(tǒng)使用一個攝像頭,index參數(shù)為1。
系統(tǒng)采用由OpenCV提供的基于小波特性的類Haar級聯(lián)分類器。它是在Viola-Jones分類器的基礎上通過對角特性擴展而得來的,采用的是boosting分類器算法。Viola-Jones篩選式級分類器中的弱分類器是一多數(shù)情況下只有一層的決策樹,該決策樹以式(2)的形式進行決策
式中:f表示判斷的特征值;v表示輸入量;t表示判斷的閾值;+1和-1表示兩個判斷結果,當v大于設定的判斷閾值時則輸出+1,表示與分類器中的模板匹配,否則就表示不匹配。
訓練時,Viola-Jones分類器在每個弱分類器中使用的1~3個特征,然后迭代建立一個由弱分類器加權相加而組成的強分類器。其建立原理如式(3)所示
如果加權和大于1,則返回1;如果加權和等于0,則返回0;如果加權和小于0,則返回-1。在分類器與所獲取的圖像進行模板計算時首先要導入分類器,然后將分類器與采集的圖像做比較運算,得出匹配結果,最后釋放分類器所占的內(nèi)存。分類器的導入函數(shù)CvHaarClassifierCascade*cvLoadHaar-ClassifierCascade(constchar* directoryCvSizeorig_window_size),其中directory表示分類器的儲存路徑,orig_window_
size表示被檢測的目標尺寸。
當檢測到駕員的眼睛的閉合程度后,通過PERCLOS算法檢測出駕駛員正處于疲勞駕駛狀態(tài)時,就開啟聲光報警信號以警示駕駛員。疲勞檢測過程如圖7所示。
圖7 疲勞檢測流程圖
使用USB攝像頭獲取駕駛員的面部圖像,面部圖像為RGB模式下的圖像,RGB模式下的面部圖像如圖8~圖11所示,并將其轉(zhuǎn)換為YCbCr模式下的圖像。
在RGB模式中除了顏色外還有亮度非常敏感,對于人眼來說不同亮度的相同顏色就意味著不同的顏色。當分析一幅人的臉部圖像時,需從圖像中去除亮度。在此使用被廣泛應用的YCbCr空間視頻壓縮標準。由于膚色主要取決于皮膚亮度,因此將YCbCr顏色空間進行非線性變換,即可去除亮度。由RGB模式下的駕駛員的面部圖像轉(zhuǎn)換到YCbCr模式下的圖像如圖12~圖15所示。
圖8 戴眼鏡睜眼RGB圖
圖9 戴眼鏡閉眼RGB圖
圖10 裸眼睜眼RGB圖
圖11 裸眼閉眼RGB圖
圖12 戴眼鏡睜眼YCbCr圖
圖13 戴眼鏡閉眼YCbCr圖
圖14 裸眼睜眼YCbCr圖
圖15 裸眼閉眼YCbCr圖
駕駛員的面部圖像經(jīng)過分類器比較運算后就可以判定駕駛員的眼部位置,然后在眼睛所在區(qū)域畫出一矩形框,從矩形框中提取出駕駛員的面部圖像。提取的眼部圖像如圖16~圖19所示。
圖16 戴眼鏡的睜眼灰度圖
圖17 戴眼鏡的閉眼灰度圖
圖18 裸眼睜眼灰度圖
圖19 裸眼閉眼灰度圖
眼部圖像提取所使用的函數(shù)主要有:CvRect*r=(CvRect*)cvGetSeqElem(eyes,i);cvRectangle(img,pt1,pt2,colors[i%8],3,8,0);利用函數(shù) cvGetSeqElem 查找指定序列中索引所指定的特定元素,調(diào)用完該函數(shù)后返回指向該元素的指針。如果指定的序列中只有一個塊,或者所需查找的元素就在第一個塊中,那么應當使用CV_GET_SEQ_ELEM。在使用時該宏首先核查所需的元素是否屬于第一個塊,若該元素屬于第一個塊,則返回該元素;否則,該宏就調(diào)用主函數(shù)GetSeqElem;若元素索引為負數(shù),繼續(xù)調(diào)用cvGetSeqElem函數(shù)。函數(shù)cvRectangle是在所指定的圖像img上通過所指定的兩點pt1和pt2作為對角線來繪制矩形框;colors表示矩形框的顏色,設計中選用紅色;參數(shù)“3”表示所畫矩形框線條的寬度,參數(shù)“8”表示矩形框線條的類型,最后一個參數(shù)表示兩個對角線點坐標精度。
灰度直方圖描述的是圖像中所有像素點的灰度值的分布情況。由于駕駛員在疲勞駕駛的時候眼睛的閉合程度肯定會大于駕駛員在精神飽滿時的閉合程度,因此疲勞時眼瞼遮蓋住黑眼球的面積就會變大,導致灰度值大的區(qū)域的像素點減少。因此,當圖片大小相同時,計算大于某一域值的灰度值,在睜眼和閉眼的圖像上就會出現(xiàn)兩個不相同的數(shù),而且睜眼的灰度圖的值定會大于閉眼灰度圖的計算值,由此就可以判斷眼睛的閉合,如圖20~圖23所示。當通過PERCLOS算法檢測出駕駛員正處于疲勞駕駛狀態(tài)時,就開啟聲光報警信號以警示駕駛員。
圖20 戴眼鏡睜眼灰度直方圖
圖21 戴眼鏡閉眼灰度直方圖
圖22 裸眼睜眼灰度直方圖
圖23 裸眼閉眼灰度直方圖
疲勞駕駛現(xiàn)象是危害自己與他人生命財產(chǎn)安全的重要原因之一,現(xiàn)今國內(nèi)眾多駕駛員都存在疲勞駕駛經(jīng)歷。本文通過采集駕駛員面部圖像,提取其眼部圖像并進行灰度處理,采用PERCLOS作為疲勞檢測標準判斷駕駛員是否處于疲勞狀態(tài)。進一步改進利用紅外線攝像頭在黑暗環(huán)境中能捕捉紅外圖像的特點,設計出能在光線微弱的環(huán)境中識別駕駛員疲勞狀態(tài)的疲勞檢測系統(tǒng),在一定程度上解決了駕駛員戴墨鏡開車無法檢測其疲勞狀態(tài)的問題。系統(tǒng)檢測準確性高,能在多種情況下檢測駕駛員是否處于駕駛疲勞狀態(tài)。
[1]胡捷.基于嵌入式Linux疲勞檢測系統(tǒng)的設計[J].數(shù)字技術與應用,2014(10):89.
[2]孟令軍,于磊,郭雄飛.疲勞檢測中人眼定位方法研究[J].電視技術,2015,39(1):133-135.
[3] SARAVANAKUMAR S,SELVARAJU N.Eye Tracking and blink detection for human computer interface[J].International Journal of Computer Applications,2010,2(2):7-9.
[4] OLSSONE M,VON SB,PANOSSIAN A G.A randomised,doubleblind,placebo-controlled,parallel-group study of the standardised extract shr-5 of the roots of Rhodiola rosea in the treatment of subjects with stress-related fatigue[J].Planta Medica,2009,75(2):105.
[5]郭永彩,李文濤,高潮.基于PERCLOS的駕駛員疲勞檢測算法[J].計算機系統(tǒng)應用,2009(8):54-57.
[6]譚歆,武岳.基于OpenCV的運動目標檢測方法研究與應用[J]. 電視技術,2010,34(1):184-187.
[7]苑瑋英,袁英.基于PERCLOS的眼睛張開程度檢測算法研究[J].微計算機信息:測控自動化,2010,9(9-1):46-48.