Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]
1.圖片演示
2.視頻演示
[項目分享]Python基于OpenCV的實時疲勞檢測[源碼&演示視頻&部署教程]_嗶哩嗶哩_bilibili
3.檢測方法
1)方法
與用于計算眨眼的傳統圖像處理方法不同,該方法通常涉及以下幾種組合:
1、眼睛定位。
2、閾值找到眼睛的白色。
3、確定眼睛的“白色”區域是否消失了一段時間(表示眨眼)。
相反,眼睛長寬比是一種更為優雅的解決方案,它涉及基于眼睛面部輪廓之間的距離之比的非常簡單的計算。
參考該博客,這種眨眼檢測方法快速,高效且易于實現。
(2)眼睛縱橫比
我們可以應用臉部界標檢測來定位臉部重要區域,包括眼睛,眉毛,鼻子,耳朵和嘴巴
這也意味著我們可以通過了解特定面部部分的索引來提取特定面部結構:
在眨眼檢測方面,我們只對兩套面部結構感興趣:眼睛。
每只眼睛都由6 (x,y)坐標表示,從坐標的左角開始(就像您在看那個人一樣),然后沿該區域的其余部分順時針旋轉:
基于此圖像,我們應該取消關鍵點:
這些坐標的寬度和高度之間存在關系。
根據Soukupová和?ech在2016年的論文《使用面部地標進行實時眼睛眨眼檢測》的工作,我們可以得出一個反映這種關系的方程,稱為眼睛縱橫比(EAR):
其中p1,…,p6是2D面部界標位置。
該方程的分子計算垂直眼界標之間的距離,而分母計算水平眼界標之間的距離,對分母進行適當加權,因為只有一組水平點,但有兩組垂直點。
(3)眨眼檢測標準
睜開眼睛時眼睛的縱橫比大約是恒定的,但是當眨眼時眼睛的縱橫比會迅速降至零。
使用這個簡單的方程式,我們可以避免使用圖像處理技術,而只需依靠眼睛界標距離的比率來確定一個人是否在眨眼。
為了更清楚地說明這一點,參考該博客:
圖: 左上:當眼睛睜開時,眼睛界標的可視化。右上:閉上眼睛時的眼睛地標。底部:繪制隨時間變化的眼睛縱橫比。眼睛縱橫比的下降表示眨眼
在左上角,我們的眼睛完全張開-此處的眼睛長寬比會很大(r),并且隨著時間的推移會相對保持恒定。
但是,一旦眨眼(右上角),眼睛的寬高比就會急劇下降,接近零。
在底部圖中繪出了眼縱橫比隨時間的視頻剪輯的曲線圖。如我們所見,眼睛的縱橫比是恒定的,然后迅速下降到接近零,然后再次增加,表明已經發生了一次眨眼。
在確定視頻流中是否發生眨眼時,我們需要計算眼睛的寬高比。
如果眼睛的寬高比下降到某個閾值以下,然后又上升到該閾值以上,那么我們將注冊“眨眼”- EYE_AR_THRESH 是此閾值。我們將其默認設置為0. 3 因為這對我的應用程序最有效,但是您可能需要針對自己的應用程序進行調整。
# 遍歷每一幀 while True:# 預處理frame = vs.read()[1]if frame is None:break(h, w) = frame.shape[:2]width=1200r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 檢測人臉rects = detector(gray, 0)# 遍歷每一個檢測到的人臉for rect in rects:# 獲取坐標shape = predictor(gray, rect)shape = shape_to_np(shape)# 分別計算ear值leftEye = shape[lStart:lEnd]rightEye = shape[rStart:rEnd]leftEAR = eye_aspect_ratio(leftEye)rightEAR = eye_aspect_ratio(rightEye)# 算一個平均的ear = (leftEAR + rightEAR) / 2.0# 繪制眼睛區域leftEyeHull = cv2.convexHull(leftEye)rightEyeHull = cv2.convexHull(rightEye)cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)# 檢查是否滿足閾值if ear < EYE_AR_THRESH:COUNTER += 1else:# 如果連續幾幀都是閉眼的,總數算一次if COUNTER >= EYE_AR_CONSEC_FRAMES:TOTAL += 1# 重置COUNTER = 0# 顯示cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.imshow("Frame", frame)key = cv2.waitKey(10) & 0xFFif key == 27:breakvs.release() cv2.destroyAllWindows()然后我們有一個重要的常數, EYE_AR_CONSEC_FRAME —此值設置為 3 表示連續三個幀的眼睛長寬比小于EYE_AR_THRESH 必須進行眨眼才能注冊眨眼。
同樣,根據流水線的幀處理吞吐率,您可能需要為自己的實現提高或降低此數字。
第44和45行初始化兩個計數器。柜臺 是眼睛長寬比小于的連續幀的總數 EYE_AR_THRESH 盡管 全部的 是腳本運行期間發生的總閃爍次數。
完整源碼&環境部署視頻教程&自定義UI界面
參考博客《Python基于OpenCV的實時疲勞檢測[源碼&演示視頻&部署教程]》
4.參考文獻
[1] 汪明明,林小竹.基于OpenCV人眼定位的人臉檢測方法[D].北京石油化工學院.2012(12).
[2] 傅亞煌,黃鳴宇.基于眼動特性的機動車駕駛疲勞系統[J].電腦與信息技術.2013(2).
[3] 王奕直,周凌霄,孔萬增.基于Adaboost的疲勞駕駛眨眼檢測[D].杭州電子科技大學學報.2013(8).
[4] 張旭,李亞利,陳晨,王生進,丁曉青.嵌入式駕駛員狀態檢測算法的實現與優化[J].自動化學報.2012(12).
[5] 趙鐘.駕駛員疲勞檢測方法研究及嵌入式實現[D]. 大連海事大學.2010(6).
[6] 徐淑峰,孫煒,趙峰,張忠.Adaboost人臉檢測算法在嵌入式平臺上的優化與實現[D].上海交通大學微電子學院.2008(6).
[7] 牛慧萍.基于DSP的人眼狀態信息檢測系統的研究和設計.[D].沈陽理工大學.2010(3).
[8] 鄭玉鐸.田楊萌.靳薇.基于Adaboost 和ASM 算法的人眼定位.[J] .北京信息科技大學學報.2013(6).
[9] 郭純宏.基于嵌入式的人眼信息檢測系統研究.[D].沈陽理工大學.2011(3).
[10] 王洪濤.駕駛疲勞測評方法研究及其DSP實現.[D].武漢理工大學.2007(5).
[11] 向本科.基于人眼檢測的駕駛員疲勞檢測研究.[D].西南大學.2010(5).
[12] 常瑜亮.基于DSP的疲勞駕駛檢測系統硬件設計與實現. [D].沈陽理工大學.2010(3).
[13] 李文磊.基于DSP的疲勞駕駛實時監測系統研究.[D] .南京理工大學.2007(6).
總結
以上是生活随笔為你收集整理的Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写运维实习生第五周实习周报,包括心得体会
- 下一篇: 微信公众号推文各标签含义