How To Master Face Detection with OpenCV
Written by Adrian, Software Engineer
OpenCV has become one of the most popular and powerful computer vision libraries out there today. Using machine learning, this library was built to allow developers a more hands-on implementation of computer vision. Being an open-source and cross-platform library has made this a vital tool for exploring academic and commercial Computer Vision capabilities.
Detect faces on live video feed!
As a prerequisite, you need to have Python installed and running on your machine. It’s generally better if you use Python 3.x version.
To install OpenCV for Python, use pip (or pip3) as follows:
foo@bar:~$ pip install opencv-python
foo@bar:~$ pip install opencv-contrib-python
which allows the use of additional contributor developer modules.
2. Import Library
In order to use the library in your .py file, you need to import the cv2 package, which is the name they gave to their Python module.
3. Cascade Classifiers
Cascade classifiers are a great way to dive into OpenCV’s amazing features. They abstract the whole Machine Learning process for a specific process (i.e. face recognition, object identification, etc.) behind a simple xml file that includes the trained model specifications.
Official OpenCV documentation tells us that: “Object Detection using Haar feature-based cascade classifiers is a machine learning based approach where a cascade function is trained from a lot of positive and negative images. It is then used to detect objects in other images.”
To explore this approach, OpenCV offers a simple but really useful catalog of pre-trained cascade classifiers on their GitHub repository. You can find them at OpenCV repository.
To import a cascade classifier, we just need to download the xml file to our file system and import it into our script.
cascade_faces = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
4. Evaluate images
Usually, we start detecting objects using openCV on individual images using cv2:
# Load image from file system image = cv2.imread('image.jpg')
Note that the method we are using in this tutorial for face detection works only on grayscale images. But don’t worry too much as cv2 offers a way to convert images when necessary.
# Convert to grayscale image to allow using detection method gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
We can use our cascade classifier to detect the objects - or in this case, faces. You can play with the second and third parameters (scaleFactor and minNeighbors) to improve the quality of object detection.
# 2nd and 3rd params are scaleFactor and minNeighbors faces = cascade_faces.detectMultiScale(gray, 1.5, 4)
According to OpenCV documentation:
scaleFactor: Parameter specifying how much the image size is reduced at each image scale. minNeighbors: Parameter specifying how many neighbors each candidate rectangle should have to retain it.
5. Draw mark
The detectMultiScale method returns a list of rectangles that represent each detection, so we need to draw all those rectangles on the image now.
CV2 offers a method to draw those rectangles having the position (x,y), width (w) and height (h) of the rectangle.
Using a for loop, we can add each rectangle to the image specifying the color (blue,green,red) and line weight (number)
for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2)
and finally, we can show the image.
6. Detection on video
If you want to go further and perform this detection on a live video feed, you first need to get a video captured.
OpenCV library offers a method to capture a video feed from files or directly from a webcam as follows:
# Live video from webcam cam = cv2.VideoCapture(0) # From video file video = cv2.VideoCapture('filename.mp4')
To implement “live” analysis and face detection on a video feed, you need to execute all of these steps: load image, detect faces, draw markers for the faces, show markers on a loop, frame by frame and add a closing condition (press ESC key).
while True: _, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = cascade_faces.detectMultiScale(gray, 1.5, 4) for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2) cv2.imshow('Faces', img) # close loop and video window when ESC key is pressed k = cv2.waitKey(30) & 0xff if k == 27: break
This is what the final script looks like:
import cv2 cascade_faces = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cam = cv2.VideoCapture(0) while True: _, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = cascade_faces.detectMultiScale(gray, 1.5, 4) for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2) cv2.imshow('Faces', img) k = cv2.waitKey(30) & 0xff if k == 27: break
Up for a challenge?
Now that you know a bit more, how about a challenge to test your detection skills? Try modifying the script to also detect eyes in the video feed. It’s not too difficult, but a great way to practice what you’ve learned! If you find yourself struggling, you can find some help for this here.
What is next?
OpenCV is an amazing open-source library for anyone who wants to explore the world of Machine Learning, Computer Vision, and general Artificial Intelligence with a hands-on approach. Go check the complete documentation at OpenCV and as always… keep learning!
Interested in hiring talented Latin American nearshore developers to add capacity to your team? Contact Jobsity: the nearshore staff augmentation choice for U.S. companies.
Subscribe for the updates
Better hires, more work, less stress. Join the Jobsity Community. Contact Us