目錄
1 專案介紹
2 代碼實作
2.1 匯入庫
2.2 定義68個關鍵點
2.3 定義eye_aspect_ratio()
2.4 定義引數
2.5 定義閾值
2.6 定義次數
2.7 創建檢測器
2.8 獲取左眼與右眼的起始點與終止點
2.9 讀取視頻
2.10 定義shape_to_np()
2.11 遍歷每一幀
2.11.1 提取每一幀影像
2.11.2 影像預處理
2.11.3 檢測人臉
2.11.4 遍歷每一張檢測的人臉
2.11.5 在影像上寫字
2.11.6 展示影像
1 專案介紹
這個是我們上一章人臉檢測的進階版,還是使用之前的68個關鍵點,在這個專案中,我們通過計算雙眼的舉例來判斷眨眼的次數,最終確認司機是否為疲勞狀態
我們現在有這樣一個開車的視頻

我們在左上角將閉眼的次數Blinks和眼之間的橫縱距離eye_ratio計算出來并寫在視頻的左上角

2 代碼實作
2.1 匯入庫

scipy是做運算用的庫,我們這里用它計算雙眼之間的距離
2.2 定義68個關鍵點

2.3 定義eye_aspect_ratio()
這個函式是計算眼部高寬比例的

這個函式會傳入眼部的七個關鍵點,我們先看一下這七個關鍵點
![]()
dist.euclidean()是計算兩點之間歐式距離的,我們一共有三個距離
- A 第1個點與第5個點的距離,也就是37與41點的距離
- B 第2個點與第4個點的距離,也就是38與40點的距離
- C 第0個點與第3個點的距離,也就是36與39點的距離
計算完A,B,C三個距離后,我們加AB距離加和之后除2(算出平均高度),然后再除寬度,計算眼鏡的高寬比eye_ratio,之后回傳eye_ratio
2.4 定義引數

2.5 定義閾值

如果高寬比小于0.3,我們認為視頻中的人物閉了一次眼,如果人物多幀都在閉眼狀態,我們定義3幀以內算一次閉眼
2.6 定義次數

counter是閉眼次數,total是總閉眼次數,區別的總閉眼次數連續3幀閉眼算一次,counter算三次
2.7 創建檢測器
首先創建正臉檢測器,然后創建關鍵點檢測器

2.8 獲取左眼與右眼的起始點與終止點

2.9 讀取視頻

2.10 定義shape_to_np()
這個在上一章提到過,不再贅述了

2.11 遍歷每一幀
![]()
2.11.1 提取每一幀影像

2.11.2 影像預處理

2.11.3 檢測人臉
![]()
2.11.4 遍歷每一張檢測的人臉
![]()
獲取關鍵點坐標

提取左眼與右眼的關鍵點坐標,之后用它們計算眼鏡的高寬比

計算兩只眼鏡平均的高寬比
![]()
計算左右眼凸包,然后把它們畫出來

如果高寬比小于EYE_AR_THRESH,COUNTER自加1

如果連續幾幀都是閉眼的,算作一次閉眼TOTAL自加1

2.11.5 在影像上寫字

2.11.6 展示影像
展示影像,如果展示程序中按ESC則退出影像,之后釋放視頻流并關閉所有視窗

我們opencv的專欄到這就結束了,如果有興趣的朋友可以看一下這個鏈接的課程視頻,本專欄是依據這個視頻做的課程筆記 Opencv計算機視覺實戰(Python版) - 網易云課堂
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300674.html
標籤:AI
