文章目錄
- 引言
- 1.相關技術介紹
- 2. 系統原理
- 2.1 眼睛縱橫比(EAR)算法
- 2.2 系統工作流程
- 3.代碼解析
- 3.1 關鍵函數說明
- 3.2 主循環邏輯
- 4.實際應用效果
- 5.參數調優建議
- 6.總結
引言
疲勞駕駛是交通事故的主要原因之一。本文將介紹如何使用Python和計算機視覺技術構建一個實時疲勞駕駛檢測系統,該系統通過分析駕駛員眼睛狀態來判斷疲勞程度。這個項目結合了人臉關鍵點檢測、幾何計算和狀態機邏輯,是一個典型的計算機視覺應用案例。
1.相關技術介紹
- Dlib:用于人臉檢測和68個關鍵點定位
- OpenCV:視頻流處理和圖像顯示
- Scikit-learn:用于計算歐氏距離
- Pillow:支持在圖像上添加中文文本
2. 系統原理
2.1 眼睛縱橫比(EAR)算法
核心算法是計算眼睛的縱橫比(Eye Aspect Ratio),公式如下:
EAR = (|p1-p5| + |p2-p4|) / (2 * |p0-p3|)
其中p1-p6是眼睛周圍的6個關鍵點:
p1 p2p0 p3 <------這是眼睛的6個關鍵點p5 p4
當眼睛睜開時,EAR值較高;閉眼時,EAR值接近0。
2.2 系統工作流程
- 通過攝像頭捕獲視頻幀
- 使用Dlib檢測人臉和眼睛關鍵點
- 計算左右眼的EAR值并取平均
- 根據EAR閾值判斷眼睛狀態
- 持續閉眼超過閾值幀數則觸發警報
3.代碼解析
3.1 關鍵函數說明
眼睛縱橫比計算:
def eye_aspect_ratio(eye):A = euclidean_distances(eye[1].reshape(1,2), eye[5].reshape(1,2))B = euclidean_distances(eye[2].reshape(1,2), eye[4].reshape(1,2))C = euclidean_distances(eye[0].reshape(1,2), eye[3].reshape(1,2))return ((A + B) / 2.0) / C
- A:計算點1和點5之間的歐幾里得距離(垂直距離1)
- B:計算點2和點4之間的歐幾里得距離(垂直距離2)
- C:計算點0和點3之間的歐幾里得距離(水平距離)
- EAR = ((A + B)/2.0)/C:這個公式計算的是眼睛的"高度"(垂直距離的平均值)與"寬度"(水平距離)的比值。
中文文本顯示:
def cv2AddChineseText(img, text, position, textColor=(0,255,0), textSize=30):"""向圖片中添加中文"""if (isinstance(img,np.ndarray)): # 判斷是否OpenCV圖片類型img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) # 實現array到image的轉換draw = ImageDraw.Draw(img) # 在img圖片上創建一個繪圖的對象# 字體的格式fontStyle = ImageFont.truetype("simsun.ttc",textSize,encoding="utf-8")draw.text(position,text,textColor,font=fontStyle) # 繪制文本return cv2.cvtColor(np.asarray(img),cv2.COLOR_BGR2RGB) # 轉換回OpenCV格式
眼睛輪廓繪制:
def drawEye(eye):eyeHull = cv2.convexHull(eye)cv2.drawContours(frame, [eyeHull], -1, (0,255,0), -1)
3.2 主循環邏輯
while True:# 讀取視頻幀# 人臉檢測和關鍵點定位rightEye = shape[36:42] # 右眼關鍵點leftEye = shape[42:48] # 左眼關鍵點# 計算EAR值ear = (leftEAR + rightEAR) / 2.0# 疲勞判斷邏輯if ear < 0.4:COUNTER += 1if COUNTER >= 30: # 持續閉眼30幀# 顯示警告else:COUNTER = 0 # 重置計數器
4.實際應用效果
系統運行時會在視頻中:
- 用綠色區域標記眼睛輪廓
- 實時顯示當前EAR值
- 當檢測到持續閉眼時顯示"危險"警告
顯示效果如下:
5.參數調優建議
-
EAR閾值:0.4是經驗值,可根據實際場景調整
調高:系統更敏感,容易誤報- 調低:系統更保守,可能漏報
-
連續幀數閾值:30幀(約1秒)
- 可根據實際需求調整疲勞判定時間
-
性能優化:
- 可降低視頻分辨率提高處理速度
- 使用多線程處理視頻流
6.總結
本文介紹了一個基于Dlib和OpenCV的實時疲勞檢測系統。該系統通過計算眼睛縱橫比來判定駕駛員狀態,具有以下特點:
- 實時性:可在普通電腦上實時運行
- 準確性:基于幾何特征而非顏色特征,適應不同光照條件
- 可擴展性:框架可輕松擴展到其他行為檢測
完整代碼已在上文中提供,讀者可以自行嘗試實現或在此基礎上進行二次開發。這個項目不僅具有實用價值,也是學習計算機視覺和人臉分析的優秀案例。
理想的風會吹進現實,熬過的夜也會變成光!我們一起努力,頂峰相見!🚀🚀🚀