Now that we know how to detect eyes in an image, let's see if we can do something fun with it. We can do something like what is shown in the following screenshot:
Let's look at the code to see how to do something like this:
import cv2 import numpy as np face_cascade = cv2.CascadeClassifier('./cascade_files/haarcascade_frontalface_alt.xml') eye_cascade = cv2.CascadeClassifier('./cascade_files/haarcascade_eye.xml') if face_cascade.empty(): raise IOError('Unable to load the face cascade classifier xml file') if eye_cascade.empty(): raise IOError('Unable to load the eye cascade classifier xml file') img = cv2.imread('input.jpg') sunglasses_img = cv2.imread('sunglasses.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) centers = [] faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (x_eye,y_eye,w_eye,h_eye) in eyes: centers.append((x + int(x_eye + 0.5*w_eye), y + int(y_eye + 0.5*h_eye))) if len(centers) > 0: # Overlay sunglasses; the factor 2.12 is customizable depending on the size of the face sunglasses_width = 2.12 * abs(centers[1][0] - centers[0][0]) overlay_img = np.ones(img.shape, np.uint8) * 255 h, w = sunglasses_img.shape[:2] scaling_factor = sunglasses_width / w overlay_sunglasses = cv2.resize(sunglasses_img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) x = centers[0][0] if centers[0][0] < centers[1][0] else centers[1][0] # customizable X and Y locations; depends on the size of the face x -= 0.26*overlay_sunglasses.shape[1] y += 0.85*overlay_sunglasses.shape[0] h, w = overlay_sunglasses.shape[:2] overlay_img[y:y+h, x:x+w] = overlay_sunglasses # Create mask gray_sunglasses = cv2.cvtColor(overlay_img, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(gray_sunglasses, 110, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask) temp = cv2.bitwise_and(img, img, mask=mask) temp2 = cv2.bitwise_and(overlay_img, overlay_img, mask=mask_inv) final_img = cv2.add(temp, temp2) cv2.imshow('Eye Detector', img) cv2.imshow('Sunglasses', final_img) cv2.waitKey() cv2.destroyAllWindows()
Just like we did earlier, we load the image and detect the eyes. Once we detect the eyes, we resize the sunglasses image to fit the current region of interest. To create the region of interest, we consider the distance between the eyes. We resize the image accordingly and then go ahead to create a mask. This is similar to what we did with the skull mask earlier. The positioning of the sunglasses on the face is subjective. So you will have to tinker with the weights if you want to use a different pair of sunglasses.