Opencv has published some haarcascade models over the years for object detection from images. These models includes face, eyes, person and some other objects. Those models can be downloaded from OpenCV github repository or also we can retrain our models on custom dataset. For list of models, visit this page and you can download any model.
We will use haarcascade frontal face and eye detection for this tutorial. You can also use other haarcascades from this repository.
There are different haarcascades for face available on given url above. We are using
haarcascade_frontalface_default.xml file for this example and you can download it from this url.
Once, file is downloaded, we can load cascade file using opencv methods.
import cv2 # load haarcascade file face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
Now we can use this to input an image and get bbox coordinates for detections in image. We can either read a single image file or use frames from a video. First we will load an image and apply haarcascade to detect faces from image. We will use detectMultiScale method to detect objects in image which by default only requires an image but we can specify other params also to get required detections. For example, we can specify min and max size of an object detection, number of neighbors for each candidate rectangle to obtain it and scale factor. You can get more details at this url.
image = cv2.imread("images/group2.jpg") # convert to grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray) # returns a list of coordinates
Now we can iterate over face list and draw rectangle using points on images.
# points are in x, y, width, height format. for (x,y,w,h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (127, 0, 255), 2) # show image cv2.imshow("image", image) cv2.waitKey(0) cv2.destroyAllWindows()
We can also detect eyes using haarcascades in opencv. We will use haarcascade provided by opencv named
haarcascade_eye.xml from haarcascades list and can be downloaded from this url.
Once downloaded, we can load this using
CascadeClassifier method in opencv.
# load eyes haarcascade file face_cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
Now we can either pass full image to this method or can use face detected from face detection script. When we input only face detected from image, we can avoid false detections that may occur in image. So, we modify previous script as follows.
for (x,y,w,h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (127, 0, 255), 2) # crop part of image containing face sub_image = image[y:y+h, x:x+w] eyes = haarcascade_eye.detectMultiScale(sub_image) # iterate over detections and draw rect on given sub image for (x, y, w, h) in eyes: cv2.rectangle(sub_image, (x, y), (x + w, y + h), (0, 0, 255), 2)
For more details on opencv haarcascades, visit these urls for documentation and tutorials.