訂閱
糾錯(cuò)
加入自媒體

在 Python 中使用 cv2 進(jìn)行嗜睡檢測

大家好,在這個(gè)博客中,我們將構(gòu)建一個(gè)嗜睡檢測應(yīng)用程序,它將檢測視頻中的人是否變得昏昏欲睡。

這是一個(gè)非常有趣且簡單的項(xiàng)目,代碼甚至不到 80 行,讓我們開始吧

看看最終輸出

注意——你不會(huì)在這里聽到警報(bào)聲,因?yàn)樗?GIF,你可以在博客上查看視頻:

嗜睡檢測代碼

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)入所需的庫。

第 6 行:設(shè)置閾值(將在前面的代碼中看到)。

第 8-9 行:使用 pygame 模塊創(chuàng)建警報(bào)聲音,以便在應(yīng)用程序中進(jìn)一步使用它。

第 11 行:我們將在前面使用的空列表。

第 13 行:使用 dlib 人臉檢測器。

第 14 行:使用 dlib 地標(biāo)檢測器檢測眼點(diǎn)。

第 16 行:初始化 cap 對(duì)象以便稍后使用 Webcam。

第 18-21 行:一個(gè)簡單的距離函數(shù),用于計(jì)算兩個(gè)坐標(biāo)之間的距離。

第 25 行:從網(wǎng)絡(luò)攝像頭讀取圖像。

第 27 行:將它們轉(zhuǎn)換為灰度。

第 30 行:檢測人臉。

第 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ò)攝像頭。

用于檢測嗜睡的算法:

· 求 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 幀中,檢測到睡意,因此播放警報(bào)。

· 我們保留了大于等于4,因?yàn)槿绻覀儾贿@樣做,即使我們眨眼,我們的程序也會(huì)發(fā)出警報(bào),這是誤報(bào)。

輸出:

注意——你不會(huì)在這里聽到警報(bào)聲,因?yàn)樗?GIF,你可以在博客上查看視頻

執(zhí)行嗜睡檢測的其他想法:第一種方法是我們?cè)谏厦鎴?zhí)行的方法。第二種方法是在人臉圖像上訓(xùn)練神經(jīng)網(wǎng)絡(luò)。第三種方法是在眼睛圖像上訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

這就是你可以使用 cv2和 dlib 在 python 中執(zhí)行嗜睡檢測的方法。


       原文標(biāo)題 : 在 Python 中使用 cv2 進(jìn)行嗜睡檢測

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)