Spaces:
ckcl
/
Build error

ckcl commited on
Commit
281e770
·
verified ·
1 Parent(s): da8f03d

Update face_analyzer.py

Browse files
Files changed (1) hide show
  1. face_analyzer.py +60 -60
face_analyzer.py CHANGED
@@ -1,60 +1,60 @@
1
- import cv2
2
- import numpy as np
3
-
4
- class FaceAnalyzer:
5
- def __init__(self):
6
- # 加載OpenCV的人臉檢測器和眼睛檢測器
7
- self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
8
- self.eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
9
-
10
- def _get_eye_aspect_ratio(self, eye_region):
11
- """
12
- 計算眼睛縱橫比(EAR
13
- :param eye_region: 眼睛區域的圖像
14
- :return: EAR
15
- """
16
- # 將眼睛區域轉換為灰度圖
17
- gray_eye = cv2.cvtColor(eye_region, cv2.COLOR_BGR2GRAY)
18
-
19
- # 檢測眼睛
20
- eyes = self.eye_cascade.detectMultiScale(gray_eye)
21
-
22
- if len(eyes) != 2: # 如果沒有檢測到兩個眼睛
23
- return 0.0
24
-
25
- # 獲取眼睛的寬度和高度
26
- eye1 = eyes[0]
27
- eye2 = eyes[1]
28
-
29
- # 計算眼睛的寬高比
30
- ear1 = eye1[2] / eye1[3]
31
- ear2 = eye2[2] / eye2[3]
32
-
33
- # 返回平均EAR
34
- return (ear1 + ear2) / 2.0
35
-
36
- def is_drowsy(self, face_image):
37
- """
38
- 檢測是否犯困
39
- :param face_image: 人臉圖片
40
- :return: 是否犯困(True/False
41
- """
42
- # 將圖片轉換為灰度圖
43
- gray = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
44
-
45
- # 檢測人臉
46
- faces = self.face_cascade.detectMultiScale(gray, 1.3, 5)
47
-
48
- if len(faces) == 0:
49
- return False
50
-
51
- # 獲取最大的人臉區域
52
- (x, y, w, h) = faces[0]
53
- face_roi = face_image[y:y+h, x:x+w]
54
-
55
- # 計算眼睛縱橫比
56
- ear = self._get_eye_aspect_ratio(face_roi)
57
-
58
- # 如果EAR小於閾值,認為是犯困
59
- EAR_THRESHOLD = 0.25
60
- return ear < EAR_THRESHOLD
 
1
+ import cv2
2
+ import numpy as np
3
+
4
+ class FaceAnalyzer:
5
+ def __init__(self):
6
+ # Load OpenCV's face detector and eye detector
7
+ self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
8
+ self.eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
9
+
10
+ def _get_eye_aspect_ratio(self, eye_region):
11
+ """
12
+ Calculate eye aspect ratio (EAR)
13
+ :param eye_region: Image of eye region
14
+ :return: EAR value
15
+ """
16
+ # Convert eye region to grayscale
17
+ gray_eye = cv2.cvtColor(eye_region, cv2.COLOR_BGR2GRAY)
18
+
19
+ # Detect eyes
20
+ eyes = self.eye_cascade.detectMultiScale(gray_eye)
21
+
22
+ if len(eyes) != 2: # If not detected two eyes
23
+ return 0.0
24
+
25
+ # Get eye width and height
26
+ eye1 = eyes[0]
27
+ eye2 = eyes[1]
28
+
29
+ # Calculate eye width-height ratio
30
+ ear1 = eye1[2] / eye1[3]
31
+ ear2 = eye2[2] / eye2[3]
32
+
33
+ # Return average EAR
34
+ return (ear1 + ear2) / 2.0
35
+
36
+ def is_drowsy(self, face_image):
37
+ """
38
+ Detect drowsiness
39
+ :param face_image: Face image
40
+ :return: Whether drowsy (True/False)
41
+ """
42
+ # Convert image to grayscale
43
+ gray = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
44
+
45
+ # Detect faces
46
+ faces = self.face_cascade.detectMultiScale(gray, 1.3, 5)
47
+
48
+ if len(faces) == 0:
49
+ return False
50
+
51
+ # Get the largest face region
52
+ (x, y, w, h) = faces[0]
53
+ face_roi = face_image[y:y+h, x:x+w]
54
+
55
+ # Calculate eye aspect ratio
56
+ ear = self._get_eye_aspect_ratio(face_roi)
57
+
58
+ # If EAR is less than the threshold, consider it drowsy
59
+ EAR_THRESHOLD = 0.25
60
+ return ear < EAR_THRESHOLD