Spaces:
Build error
Build error
| import cv2 | |
| import numpy as np | |
| class FaceAnalyzer: | |
| def __init__(self): | |
| # 加載OpenCV的人臉檢測器和眼睛檢測器 | |
| self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') | |
| self.eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml') | |
| def _get_eye_aspect_ratio(self, eye_region): | |
| """ | |
| 計算眼睛縱橫比(EAR) | |
| :param eye_region: 眼睛區域的圖像 | |
| :return: EAR值 | |
| """ | |
| # 將眼睛區域轉換為灰度圖 | |
| gray_eye = cv2.cvtColor(eye_region, cv2.COLOR_BGR2GRAY) | |
| # 檢測眼睛 | |
| eyes = self.eye_cascade.detectMultiScale(gray_eye) | |
| if len(eyes) != 2: # 如果沒有檢測到兩個眼睛 | |
| return 0.0 | |
| # 獲取眼睛的寬度和高度 | |
| eye1 = eyes[0] | |
| eye2 = eyes[1] | |
| # 計算眼睛的寬高比 | |
| ear1 = eye1[2] / eye1[3] | |
| ear2 = eye2[2] / eye2[3] | |
| # 返回平均EAR | |
| return (ear1 + ear2) / 2.0 | |
| def is_drowsy(self, face_image): | |
| """ | |
| 檢測是否犯困 | |
| :param face_image: 人臉圖片 | |
| :return: 是否犯困(True/False) | |
| """ | |
| # 將圖片轉換為灰度圖 | |
| gray = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY) | |
| # 檢測人臉 | |
| faces = self.face_cascade.detectMultiScale(gray, 1.3, 5) | |
| if len(faces) == 0: | |
| return False | |
| # 獲取最大的人臉區域 | |
| (x, y, w, h) = faces[0] | |
| face_roi = face_image[y:y+h, x:x+w] | |
| # 計算眼睛縱橫比 | |
| ear = self._get_eye_aspect_ratio(face_roi) | |
| # 如果EAR小於閾值,認為是犯困 | |
| EAR_THRESHOLD = 0.25 | |
| return ear < EAR_THRESHOLD |