Face Detection from an Image using OpenCV & Python
OpenCV (Open Source Computer Vision Library) is an open-source computer vision and machine learning software library. This library mainly aims at real-time computer vision. In other words, we can say it is a library used for Image Processing.
It is mainly used to do all the operations related to Images like to analyze the data from the Camera of an Embedded system or your computer or anything that captures images (e.g. From a LIDAR).
It is written in C++ and supported by various programming languages such as C++, Java, Python. Some applications of OpenCV includes read and write Images, detection of faces and its features, text recognition in images, developing augmented reality apps.
First, let’s discuss
How Computers Read Images?
Computers read the image in the form of a matrix range between 0 to 255. For colored image, there are 3 channels Red, Green, Blue and there is a matrix associated with each of the channel, each element of this matrix represents the intensity of brightness of that pixel.
All the 3 channels will have their separate matrix which is stacked on each other to create 3-D metrics. For Gray/black image there is a 2-D matrix.
Coloured Image has 3 channels
Gray/Black scale image has 1 channel.
In the same way, the computer captures video. Video is multiple images/frames which are displayed very quickly.
In this article, we will be using OpenCV along with HAAR Cascade Classifiers for reading and detecting images.
Haar Cascade Classifiers
Haar Cascade Classifier is a machine learning algorithm that is used to identify objects in images or videos. For detection of the image, the computer extracts features of an image and use those features to classify the image. It is an algorithm that works by classification.
The algorithm is fed a large number of images, positive (images with faces/objects we are interested in), and negative (images other than our target).
Then the algorithm extracts features from each image and classifies them into two parts. So depending upon the features extracted by the algorithm we use it to detect the object. Using Haar Cascade Classifiers you can detect the face of a person, eyes, objects such as cars, etc.
For getting started with face detection we first need to install OpenCV library, you can install it by using
pip install OpenCV-python
if you need only main modules
pip install OpenCV-contrib-python
if you need both main and contrib modules.
Haar Cascade Files
The Haar Cascade files come in the form of XML. To use them we need to download them. It can be download from here.
Also, it is recommended to store these XML files in the data folder in the same working directory as the jupyter notebook/python file.
import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import time # Create the haar cascade cascPath = 'detect/haarcascade_frontalface_alt.xml' # cascPath = 'detect/haarcascade_frontalface_default.xml' faceCascade = cv2.CascadeClassifier(cascPath) # Read the image img = cv2.imread('images/apink.jpg') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) def detect_faces_show(fpath): img = cv2.imread(fpath) gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=6, minSize=(40, 40), flags = cv2.CASCADE_SCALE_IMAGE ) print("Found %d faces!" % len(faces)) # Draw a rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 4) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) detect_faces_show('images/apink.jpg')
In the above code we created a detect_faces_show function which is the most important part of the code.
In this function we used detectMultiScale module of the classifier. It returns rectangle with coordinates(x,y,w,h) around the detected face.
Then we loop over all the coordinates it returned and draw rectangles around them using OpenCV. And finally we displayed the image with all the faces detected correctly.