使用OpenCV 和 Dlib 實現疲勞檢測

文章目錄

  • 引言
  • 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 系統工作流程

  1. 通過攝像頭捕獲視頻幀
  2. 使用Dlib檢測人臉和眼睛關鍵點
  3. 計算左右眼的EAR值并取平均
  4. 根據EAR閾值判斷眼睛狀態
  5. 持續閉眼超過閾值幀數則觸發警報

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.實際應用效果

系統運行時會在視頻中:

  1. 用綠色區域標記眼睛輪廓
  2. 實時顯示當前EAR值
  3. 當檢測到持續閉眼時顯示"危險"警告

顯示效果如下:

在這里插入圖片描述

5.參數調優建議

  1. EAR閾值:0.4是經驗值,可根據實際場景調整
    調高:系統更敏感,容易誤報

    • 調低:系統更保守,可能漏報
  2. 連續幀數閾值:30幀(約1秒)

    • 可根據實際需求調整疲勞判定時間
  3. 性能優化

    • 可降低視頻分辨率提高處理速度
    • 使用多線程處理視頻流

6.總結

本文介紹了一個基于Dlib和OpenCV的實時疲勞檢測系統。該系統通過計算眼睛縱橫比來判定駕駛員狀態,具有以下特點:

  1. 實時性:可在普通電腦上實時運行
  2. 準確性:基于幾何特征而非顏色特征,適應不同光照條件
  3. 可擴展性:框架可輕松擴展到其他行為檢測

完整代碼已在上文中提供,讀者可以自行嘗試實現或在此基礎上進行二次開發。這個項目不僅具有實用價值,也是學習計算機視覺和人臉分析的優秀案例。

理想的風會吹進現實,熬過的夜也會變成光!我們一起努力,頂峰相見!🚀🚀🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79736.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79736.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VBA實現后入先出(LIFO)庫存統計

先入先出&#xff08;FIFO&#xff09;比較容易理解&#xff0c;買入早的優先賣出。與之對應的是后人先出&#xff08;LIFO&#xff09;&#xff0c;就是優先賣出最近買入的&#xff0c;例如&#xff1a;第8行賣出2K&#xff0c;當天還沒有買入記錄&#xff0c;只能找前一天的買…

Python中的客戶端和服務端交互的基本內容

目錄 網絡協議 網絡的通信方式 需要安裝的組件和需要導入的包模塊 安裝的組件 導入包模塊 如何創建客戶端 如何創建服務端 網絡協議 IPV4&#xff1a;是互聯網協議的第四版&#xff0c;也是目前廣泛使用的網絡協議。它使用32位地址格式&#xff0c;理論上可以提供約43億…

【硬核攻堅】告別CUDA OOM!DeepSeek部署顯存瓶頸終極解決方案:三大策略高效落地

目錄 引言:大模型落地的“甜蜜”與“煩惱”DeepSeek剖析:為何它如此“吃”顯存?CUDA OOM的“幽靈”:現象、根因與診斷破局之道:三大策略馴服顯存“猛獸” 策略一:模型量化 - 給模型“瘦身”的藝術策略二:動態優化 - 榨干硬件潛能策略三:分布式擴展 - 集群的力量實戰演練…

JavaSE核心知識點01基礎語法01-01(關鍵字、標識符、變量)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點01基礎語法01-01&#xff0…

【最新Python包管理工具UV的介紹和安裝】

介紹 uv是一個非常快的 Python 包安裝程序和 pip 解析器&#xff0c;用 Rust 編寫&#xff0c;設計為pip-tools的直接替代品。 以下是官網給出的UV與其他包管理工具解決依賴&#xff08;左&#xff09;和安裝包&#xff08;右&#xff09;的對比圖。 可以看出UV是一個極快的 P…

麒麟、UOS系統在線打開word文件并提取修訂痕跡

麒麟、UOS系統在線打開word文件并提取修訂痕跡 查看本示例演示效果&#xff08;Windows版&#xff09; 查看本示例演示效果&#xff08;國產版&#xff09;本示例關鍵代碼的編寫位置&#xff0c;請參考“開始 - 快速上手”里您所使用的開發語言框架的最簡集成代碼 注意 本文中…

【SpringAI+阿里云百煉】AI對話4個Demo

基于SpringAI和阿里云百煉平臺&#xff0c;實現了四個AI對話的小Demo 小團團對話機器人哄哄模擬器培訓班智能客服仿ChatPDF 筆記如下:語雀知識筆記《SpringAI》

【數據結構】單鏈表的增刪查改

本文是小編鞏固自身而作&#xff0c;如有錯誤&#xff0c;歡迎指出&#xff01; 1.鏈表的概念 概念&#xff1a;鏈表是?種物理存儲結構上?連續、?順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的 指針鏈接次序實現的。 和之前的順序表不同&#xff0c;順序一般…

LeetCode 1128.等價多米諾骨牌對的數量:計數

【LetMeFly】1128.等價多米諾骨牌對的數量&#xff1a;計數 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/number-of-equivalent-domino-pairs/ 給你一組多米諾骨牌 dominoes 。 形式上&#xff0c;dominoes[i] [a, b] 與 dominoes[j] [c, d] 等價 當且僅當 (a …

以太坊智能合約開發框架:Hardhat v2 核心功能從入門到基礎教程

一、設置項目 Hardhat 項目是安裝了 hardhat 包并包含 hardhat.config.js 文件的 Node.js 項目。 操作步驟&#xff1a; ①初始化 npm npm init -y②安裝 Hardhat npm install --save-dev hardhat③創建 Hardhat 項目 npx hardhat init如果選擇 Create an empty hardhat.…

安卓基礎(無障礙點擊)

無障礙點擊核心代碼 // 自定義無障礙服務類&#xff0c;繼承自Android系統的AccessibilityService public class MyAccessibilityService extends AccessibilityService {// 當系統產生無障礙事件時的回調方法&#xff08;如界面變化、焦點切換等&#xff09;Overridepublic v…

阿里云服務遷移實戰: 05-OSS遷移

概述 Bucket 復制分為兩種&#xff0c;同區域復制和跨區域復制 同賬號復制比較簡單&#xff0c;根據提示填寫信息即可&#xff0c;本文主要介紹跨賬號復制。 同區域復制 授權角色選擇 “AliyunOSSRole”, 創建方法見 “跨區域復制”。然后點擊確定即可。 跨區域復制 假設我…

Qt 的信號與槽機制依賴元對象系統(Meta-Object System)實現

內部數據結構 在 Qt 中,信號和槽之間的連接主要通過 QObject 類及其相關的私有類進行管理。每個 QObject 實例都維護著一個指向其 QMetaObject 的指針,該對象包含了有關類的所有元信息,包括信號、槽等。此外,還有一個關鍵的數據結構用于存儲信號與槽之間的連接信息,即 Co…

前端面試寶典---性能優化

一、加載優化 1. 第三方模塊放在CDN 例如 leaflet通過cdn引入&#xff0c;這樣就不會占用打包體積了 2. prefetch 預加載 例如&#xff0c;之后馬上有個場景需要一個圖片&#xff0c;我們就可以通過link 的 prefetch 對資源進行預先加載 再例如&#xff0c;我們公司是無網絡開…

從零開始:Android Studio開發購物車(第二個實戰項目)

一年經驗的全棧程序員&#xff0c;目前頭發健在&#xff0c;但不知道能撐多久。 文章目錄 前言 一、頁面編寫 1. 頂部標簽欄title_shopping.xml 2. 商品展現列表activity_shopping_channel.xml 3. 商品詳情頁面activity_shopping_detail.xml 4. 購物車頁面activity_shopping…

PostgteSQL for Everybody基礎部分筆記

筆記分享內容參考密歇根大學 Charles Russell Severance 開設的PostgreSQL課程&#xff1a;postgresql-for-everybody&#xff0c;網址為&#xff1a;https://www.coursera.org/specializations/postgresql-for-everybody#courses&#xff0c;在B站等也有相關視頻分享。 我分享…

Python項目源碼63:病歷管理系統1.0(tkinter+sqlite3+matplotlib)

1.病歷管理系統包含以下主要功能&#xff1a; 核心功能&#xff1a;病歷信息錄入&#xff08;患者姓名、年齡、性別、診斷結果、主治醫生&#xff09;&#xff0c;自動記錄就診時間&#xff0c;病歷信息展示&#xff08;使用Treeview表格&#xff09;&#xff0c;病歷信息查詢…

MCP底層協議完整通信過程

2025 年是智能體的元年, 也注定是智能體集中爆發的一年! 兩個互聯領域的重大挑戰: 第一、 Agent 與 Tools (工具)的交互 Agent 需要調用外部工具和 API

docker:制作鏡像+上傳鏡像+拉取鏡像

1.dockerfile制作鏡像 示例內容&#xff1a; 1.創建一個index.js的文件 console.log("hello world")2.在相同目錄下創建名為dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.構建鏡像 docker build -t minterra/hello-docker . …

docker制作python大模型鏡像(miniconda環境),工程改造記錄

**環境說明&#xff1a;**從系統鏡像開始打造python大模型鏡像&#xff0c;之前是人工手動裝的方式&#xff0c;并且模型和依賴在公網中&#xff0c;對于離線交付環境不太友好&#xff0c;所以打造的離線化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…