1
1
import cv2
2
2
3
3
4
- eyes = cv2 .CascadeClassifier ("haarcascades/haarcascade_eye.xml" )
4
+ eye = cv2 .CascadeClassifier ("haarcascades/haarcascade_eye.xml" )
5
5
face = cv2 .CascadeClassifier ("haarcascades/haarcascade_frontalface_alt.xml" )
6
- image = cv2 .imread ("glasses.png" , - 1 )
6
+ image = cv2 .imread ("glasses.png" , - 1 ) # -1 includes the alpha channel
7
7
capture = cv2 .VideoCapture (0 )
8
8
9
+ def adjust_glasses (h , eyes_w , eyes_h ):
10
+ ''' helper function that computes values to scale/translate glasses '''
11
+
12
+ # derive initial glasses possition/scale from eyes
13
+ v1 = eyes_h * (- 1 )
14
+ v2 = eyes_h * 5
15
+ u1 = eyes_w * (- 1 )
16
+ u2 = eyes_w * 8
17
+
18
+ # normalize values
19
+ u1 = max (0 , u1 )
20
+ v1 = max (0 , v1 )
21
+ u2 = min (h , u2 )
22
+ v2 = min (h , v2 )
23
+
24
+ return v1 , v2 , u1 , u2
25
+
9
26
def deal_with_it (eyes_cascade , face_cascade , glasses_img ):
10
- '''live meme generator '''
27
+ ''' function detects faces and places the classic meme sunglasses on the detected face(s)! '''
11
28
12
- #mask
29
+ #creates mask
13
30
glasses_mask = glasses_img [:, :, 3 ]
14
31
glasses_mask_inv = cv2 .bitwise_not (glasses_mask )
15
32
@@ -18,74 +35,51 @@ def deal_with_it(eyes_cascade, face_cascade, glasses_img):
18
35
19
36
while (True ):
20
37
# Capture video feed
21
- unused , img = capture .read ()
22
- frame = cv2 .flip (img , 1 )
38
+ img = capture .read ()[ 1 ]
39
+ frame = cv2 .flip (img , 1 )
23
40
24
41
# grayscale
25
42
gray = cv2 .cvtColor (frame , cv2 .COLOR_BGR2GRAY )
26
43
27
- faces = face_cascade .detectMultiScale (gray ,scaleFactor = 1.1 , minNeighbors = 5 , minSize = (30 , 30 ), flags = cv2 .CASCADE_SCALE_IMAGE )
44
+ faces = face_cascade .detectMultiScale (gray , scaleFactor = 1.3 , minNeighbors = 2 , minSize = (15 , 25 ), flags = cv2 .CASCADE_SCALE_IMAGE )
28
45
29
46
for (x , y , w , h ) in faces :
30
47
31
- roi_gray = gray [y :y + h , x :x + w ]
32
- roi_color = frame [y :y + h , x :x + w ]
48
+ color = frame [y :y + h , x :x + w ]
49
+ grayscale = gray [y :y + h , x :x + w ]
33
50
34
- eyes = eyes_cascade .detectMultiScale (roi_gray )
35
-
36
- for (nx ,ny ,nw ,nh ) in eyes :
37
-
38
- glasses_width = nw * 4
39
- glasses_height = orig_glasses_height * 2
40
- area = glasses_width * glasses_height
51
+ eyes = eyes_cascade .detectMultiScale (grayscale )
41
52
42
- # possition
43
- x1 = nx - glasses_width * 2
44
- x2 = nx + nw + glasses_width * 2
45
- y1 = ny + nh - glasses_height
46
- y2 = ny + nh + glasses_height
47
-
48
- # black magic
49
- if x1 < 0 :
50
- x1 = 0
51
- if x2 > w :
52
- x2 = w
53
- if y1 < 0 :
54
- y1 = 0
55
- if y2 > h :
56
- y2 = h
57
-
58
- # adjust bassed on black magic
59
- glasses_height = y2 - y1
60
- glasses_width = x2 - x1
61
-
62
- # rescale
63
- glasses = cv2 .resize (glasses_img , (glasses_width ,glasses_height ), interpolation = cv2 .INTER_AREA )
64
- mask = cv2 .resize (glasses_mask , (glasses_width ,glasses_height ), interpolation = cv2 .INTER_AREA )
65
- mask_inv = cv2 .resize (glasses_mask_inv , (glasses_width ,glasses_height ), interpolation = cv2 .INTER_AREA )
53
+ for (eyes_x , eyes_y , eyes_w , eyes_h ) in eyes :
54
+
55
+ v1 , v2 , u1 , u2 = adjust_glasses (h , eyes_w , eyes_h )
56
+
57
+ # resize glasses and masks
58
+ glasses = cv2 .resize (glasses_img , (u2 - u1 , v2 - v1 ))
59
+ mask = cv2 .resize (glasses_mask , (u2 - u1 , v2 - v1 ))
60
+ mask_inv = cv2 .resize (glasses_mask_inv , (u2 - u1 , v2 - v1 ))
66
61
67
62
# some more black magic
68
- roi = roi_color [ y1 : y2 , x1 : x2 ]
63
+ roi = color [ v1 : v2 , u1 : u2 ]
69
64
70
65
# difference between regions of interest
71
- roi_bg = cv2 .bitwise_and (roi , roi , mask = mask_inv )
72
- roi_fg = cv2 .bitwise_and (glasses , glasses , mask = mask )
66
+ foreround = cv2 .bitwise_and (glasses , glasses , mask = mask )
67
+ background = cv2 .bitwise_and (roi , roi , mask = mask_inv )
73
68
74
- # combine regions
75
- dst = cv2 .add (roi_bg ,roi_fg )
76
- roi_color [y1 :y2 , x1 :x2 ] = dst
69
+ # combines fg and bg of the eyes/glasses region by adding them
70
+ color [v1 :v2 , u1 :u2 ] = cv2 .add (foreround , background )
77
71
78
72
break
79
73
80
- # video feed
81
- cv2 .imshow ("Deal With It @ SalemStateMemes.edu " , frame )
74
+ # display video feed
75
+ cv2 .imshow ("Sunglass-o-matic " , frame )
82
76
83
- #exit
84
- if cv2 .waitKey (1 ) == 27 : #esc key
77
+ # The Escape key has to be pressed to exit the video window
78
+ if cv2 .waitKey (1 ) == 27 :
85
79
break
86
80
87
81
capture .release ()
88
82
cv2 .destroyAllWindows ()
89
83
90
84
if __name__ == '__main__' :
91
- deal_with_it (eyes , face , image )
85
+ deal_with_it (eye , face , image )
0 commit comments