日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python + dlib 实现简单疲劳驾驶检测

發(fā)布時間:2024/3/24 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python + dlib 实现简单疲劳驾驶检测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引言

本文章實現(xiàn)的疲勞駕駛功能比較單一,僅對眼部進行一個眨眼閾值的檢測,并沒有對人臉其它部位(瞌睡會點頭、嘴部微張等)進行檢測,需要在疲勞駕駛這個方向上深究的hxd可以自己對代碼進行迭代更新。

這篇文章會很啰嗦,想看代碼的hxd可以跳到后邊去看。。。

僅供參考— 因為Github上已經有開源的項目了

需要用到的環(huán)境及配置文件

python3.8
dlib
opencv

定位人臉關鍵點模型(注:進入頁面后拖到最下邊,下載 shape_predictor_68_face_landmarks.dat.bz2 這個文件)

本次項目實現(xiàn)的理論來源–論文

dlib人臉關鍵點模型有問題的可以參考這篇文章,再不會可以給我留言,有問必答。

實現(xiàn)思路

1、獲取到人臉,計算機攝像頭獲取到的圖像是一張大畫布,人臉在上邊顯得很小,這時候按照傳統(tǒng)的方法需要寫一些回歸算法來定位到人臉,而dlib的內置函數(shù)會幫我們解決這一問題。

2、獲取到人臉關鍵點,在上邊的基礎上,定位到人臉之后,再利用我們上述說到的68個關鍵點模型對關鍵點進行定位


利用68個關鍵點模型獲取到人臉的關鍵點坐標后,仔細觀察可以看到左眼坐標是(42-48),右眼坐標是(36-42) ,得到關鍵點坐標之后就可以開擼了

3、最后參考上邊的論文算法基礎對本項目進行最后的實現(xiàn),簡單說一下這篇論文算法的核心思想。

這篇論文提到了兩個關鍵的參數(shù),EAR(眨眼最小閾值)、ratio(連續(xù)眨眼的最小連續(xù)幀)。

這里解釋一下這個ratio,因為計算讀取視頻其實就是將視頻分為一幀一幀的來播放,這里你可以理解為PPT放映,就是當閉眼超過多少幀之后,判定為瞌睡疲勞駕駛。

代碼實現(xiàn)

import cv2 import dlib import pygame import time from scipy.spatial import distance from collections import OrderedDict from imutils import face_utils# 讀取音樂 pygame.mixer.init() pygame.mixer.music.load('../img/audio.mp3')# 加載dlib人臉分類器 detection = dlib.get_frontal_face_detector() # 讀取68點模型文件 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 開攝像頭 video_capture = cv2.VideoCapture(0) time.sleep(2)# 求er值 def calculate_EAR(eye):# 計算眼睛之間的距離,利用scipy distance 計算上眼皮和下眼皮之間歐氏距離A = distance.euclidean(eye[1], eye[5])B = distance.euclidean(eye[2], eye[4])C = distance.euclidean(eye[0], eye[3])ear_aspect_ratio = (A + B) / (2.0 * C)return ear_aspect_ratio# 眨眼最小閾值 觸發(fā)報警的眼睛縱橫比的最小閾值 eyes_blink = 0.3 # 眼睛比率低于觸發(fā)警報閾值的最小連續(xù)幀 eyes_ratio = 50 # 眨眼次數(shù)檢測 count = 0 SHAPE_68_INDEX = OrderedDict([("left_eye", (42, 48)),("right_eye", (36, 42)) ]) # 拿坐標 (lstart,lend) = SHAPE_68_INDEX['left_eye'] (rstart,rend) = SHAPE_68_INDEX['right_eye']while (True):# 讀取每個幀并將其翻轉,然后轉換為灰度ret, frame = video_capture.read()frame = cv2.flip(frame,1)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用模型文件對臉型上的68個點進行定位尋找faces = detection(gray,0)for face in faces:shape = predictor(gray, face)shape = face_utils.shape_to_np(shape)# 左右眼坐標leftEye = shape[lstart:lend]rightEye = shape[rstart:rend]# 調用參數(shù)計算上眼皮和下眼皮的距離leftEyeDistance = calculate_EAR(leftEye)rightEyeDistance = calculate_EAR(rightEye)# 計算均值ER = (leftEyeDistance+rightEyeDistance) / 2# 利用cv2.convexhull 尋找圖像凸包(凸包就是:打比方一個五角星,每一個尖點相連)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 (ER < eyes_blink):count += 1if count >= eyes_ratio:pygame.mixer.music.play(-1)# 因為編碼格式原因,中文顯示不了cv2.putText(frame, "you are tired", (150, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2)else:pygame.mixer.music.stop()count = 0cv2.imshow('Video', frame)if(cv2.waitKey(1) & 0xFF == ord('q')):breakvideo_capture.release() cv2.destroyAllWindows()

總結

為了方便大家看得更清晰一點,我加了很多注釋,還有什么問題歡迎大家點贊留言

總結

以上是生活随笔為你收集整理的python + dlib 实现简单疲劳驾驶检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。