在 Python 中使用 cv2 進(jìn)行嗜睡檢測(cè)
大家好,在這個(gè)博客中,我們將構(gòu)建一個(gè)嗜睡檢測(cè)應(yīng)用程序,它將檢測(cè)視頻中的人是否變得昏昏欲睡。
這是一個(gè)非常有趣且簡(jiǎn)單的項(xiàng)目,代碼甚至不到 80 行,讓我們開始吧
看看最終輸出
注意——你不會(huì)在這里聽到警報(bào)聲,因?yàn)樗?GIF,你可以在博客上查看視頻:
嗜睡檢測(cè)代碼
from imutils import face_utils
import dlib
import cv2
from pygame import mixer
thres = 6
mixer.init()
sound = mixer.Sound('alarm.wav')
dlist = []
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
cap = cv2.VideoCapture(0)
def dist(a,b):
x1,y1 = a
x2,y2 = b
return ((x1-x2)**2 + (y1-y2)**2)**0.5
while True:
# Getting out image by webcam
_, image = cap.read()
# Converting the image to gray scale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Get faces into webcam's image
rects = detector(gray, 0)
# For each detected face, find the landmark.
for (i, rect) in enumerate(rects):
# Make the prediction and transfom it to numpy array
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# Draw on our image, all the finded cordinate points (x,y)
for (x, y) in shape:
cv2.circle(image, (x, y), 2, (0, 255, 0), -1)
le_38 = shape[37]
le_39 = shape[38]
le_41 = shape[40]
le_42 = shape[41]
re_44 = shape[43]
re_45 = shape[44]
re_47 = shape[46]
re_48 = shape[47]
dlist.a(chǎn)ppend((dist(le_38,le_42)+dist(le_39,le_41)+dist(re_44,re_48)+dist(re_45,re_47))/4<thres)
if len(dlist)>10:dlist.pop(0)
# Drowsiness detected
if sum(dlist)>=4:
try:
sound.play()
except:
pass
else:
try:
sound.stop()
except:
pass
# Show the image
cv2.imshow("Output", image)
if cv2.waitKey(5) & 0xFF == 27:
break
cv2.destroyAllWindows()
cap.release()
第 1-4 行:導(dǎo)入所需的庫(kù)。
第 6 行:設(shè)置閾值(將在前面的代碼中看到)。
第 8-9 行:使用 pygame 模塊創(chuàng)建警報(bào)聲音,以便在應(yīng)用程序中進(jìn)一步使用它。
第 11 行:我們將在前面使用的空列表。
第 13 行:使用 dlib 人臉檢測(cè)器。
第 14 行:使用 dlib 地標(biāo)檢測(cè)器檢測(cè)眼點(diǎn)。
第 16 行:初始化 cap 對(duì)象以便稍后使用 Webcam。
第 18-21 行:一個(gè)簡(jiǎn)單的距離函數(shù),用于計(jì)算兩個(gè)坐標(biāo)之間的距離。
第 25 行:從網(wǎng)絡(luò)攝像頭讀取圖像。
第 27 行:將它們轉(zhuǎn)換為灰度。
第 30 行:檢測(cè)人臉。
第 33 行:開始遍歷這些面部。
第 35-36 行:獲取 68 個(gè)面部特征并將它們轉(zhuǎn)換為 NumPy 數(shù)組。
第 39–40 行:畫出所有的地標(biāo)。
第 42-50 行:提取所需的眼睛標(biāo)志。
對(duì)于左眼,我們將提取38、39、42 和 41。
對(duì)于右眼,我們將提取44、45、48 和 47。
在閱讀進(jìn)一步的步驟之前,請(qǐng)閱讀下面的算法。
第 54 行:該行負(fù)責(zé)保持 dlist=10 的大小。
刪除是從前面完成的,添加是在最后完成的。
這就像一個(gè)隊(duì)列系統(tǒng)。
第 57–66 行:當(dāng) dlist 中至少有 4 個(gè) True 時(shí)播放警報(bào)。當(dāng)它們小于 4 時(shí)停止。第 69 行:顯示圖像。
第 71–72 行:當(dāng)用戶按下ESC鍵時(shí)停止應(yīng)用程序。
第 74–75 行:關(guān)閉所有 cv2 窗口并釋放網(wǎng)絡(luò)攝像頭。
用于檢測(cè)嗜睡的算法:
· 求 38-42、39-41、44-48 和 45-47 地標(biāo)之間的距離,并求這 4 個(gè)地標(biāo)的平均值。
· 如果這個(gè)平均值大于我們最初定義的 thres,則在我們的 dlist 中追加/添加一個(gè) True。
· 如果我們的 dlist 包含 4 個(gè)或更多 Trues,則意味著在連續(xù) 4 幀中,檢測(cè)到睡意,因此播放警報(bào)。
· 我們保留了大于等于4,因?yàn)槿绻覀儾贿@樣做,即使我們眨眼,我們的程序也會(huì)發(fā)出警報(bào),這是誤報(bào)。
輸出:
注意——你不會(huì)在這里聽到警報(bào)聲,因?yàn)樗?GIF,你可以在博客上查看視頻
執(zhí)行嗜睡檢測(cè)的其他想法:第一種方法是我們?cè)谏厦鎴?zhí)行的方法。第二種方法是在人臉圖像上訓(xùn)練神經(jīng)網(wǎng)絡(luò)。第三種方法是在眼睛圖像上訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
這就是你可以使用 cv2和 dlib 在 python 中執(zhí)行嗜睡檢測(cè)的方法。
原文標(biāo)題 : 在 Python 中使用 cv2 進(jìn)行嗜睡檢測(cè)

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語(yǔ)權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷中東?
- 8 Robotaxi新消息密集釋放,量產(chǎn)元年誰在領(lǐng)跑?
- 9 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過于簡(jiǎn)單
- 10 “搶灘”家用機(jī)器人領(lǐng)域,聯(lián)通、海爾、美的等紛紛入局