Following code strems video from a web cam and detects face and eyes:
import numpy as np
import cv2
from matplotlib import pyplot as plt
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
cap=cv2.VideoCapture(1)
while True:
ret, img =cap.read()
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x+y), (x+w,y+h), (255,0,0) ,2)
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(ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color, (ex,ey),(ex+ew, ey+eh) ,(0,255,0) , 2)
cv2.imshow('img',img)
k=cv2.waitKey(30) & 0xff
if k=27:
break
cap.release()
cv2.destroyAllWindows()
Before running this code we are required to download haarcascade_frontalface_default.xml and haarcascade_eye.xml you can find it on haarcascade's github page or you can import it from OpenCV
OpenCV already contains many pre-trained classifiers for face, eyes, smile etc. Those XML files are stored in opencv/data/haarcascades/ :
~/OpenCV/opencv/data/haarcascades$ ls
haarcascade_eye_tree_eyeglasses.xml haarcascade_mcs_leftear.xml
haarcascade_eye.xml haarcascade_mcs_lefteye.xml
haarcascade_frontalface_alt2.xml haarcascade_mcs_mouth.xml
haarcascade_frontalface_alt_tree.xml haarcascade_mcs_nose.xml
haarcascade_frontalface_alt.xml haarcascade_mcs_rightear.xml
haarcascade_frontalface_default.xml haarcascade_mcs_righteye.xml
haarcascade_fullbody.xml haarcascade_mcs_upperbody.xml
haarcascade_lefteye_2splits.xml haarcascade_profileface.xml
haarcascade_lowerbody.xml haarcascade_righteye_2splits.xml
haarcascade_mcs_eyepair_big.xml haarcascade_smile.xml
haarcascade_mcs_eyepair_small.xml haarcascade_upperbody.xml
- ret, img =cap.read() reads webcam input
- cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) we convert color image to black and white to reduce unecessory computation
- cv2.rectangle(img, (x+y), (x+w,y+h), (255,0,0) ,2) creating a rectangle around the face and next two lines specify face boundaries
- cv2.imshow('img',img) is used to output the processed image with rectangles around face and eyes