Posted by Marta on December 18, 2020 Viewed 3919 times
This article shows what is the purpose of openCV, how to download it and some cool stuff that you can do with openCV. Plus showing you how to perform face detection on an image using openCV. This library makes this task extremely simple. Let’s get started
What is the purpose of OpenCV? OpenCV is a library for solving vision problems. Used for video and image analysis. For instance, you can analyse an image and find the number of people present in the image. Some cool things that you can do with this library are:
Now you know what opencv is. Let’s download it! First you need to download python in your machine. Once you installed python, the package manager called pip will be available for you to use. You will use package manager to download modules and keep track of the installed modules.
To make sure, both python and pip are correctly installed, run these commands from your terminal:
python3 --version pip3 --version
Now you are ready to download any library you like via pip. Let’s set up openCV. First you need to install the numpy library. Numpy is a library for efficient array and matrix computing. OpenCV uses numpy to convert images to pixel matrices that can be easily manipulated. To install numpy and opencv on your laptop, run the following commands from your terminal:
pip install numpy pip install opencv-python
You just installed all necessary libraries. Now you are ready to do some cool stuff like face detection. Using opencv you can achieve face detection with about 5 lines of code! To be more concrete, here are the steps I will follow to perform face detection. First, loading an image saved in my machine. Next, drawing a rectangle around any face found in the image. It sounds like a simple task, however if you try to program this, without using libraries, the amount of code you need to write will be insane.
Pick any image you like containing a face, and place it in a directory in your machine. Any directory as long as it is the same directory where you are gonna write your python script. As a quick note, I am using the same folder just for simplicity. My image is called sample_image.png. Next I will create a python file called face_detection.py
and add the following code:
import cv2 image = cv2.imread('sample_image.png')
Please note you will need to import the opencv library, so all the image analysing functionality is available to use in your script. The code above will load the image and store it in a variable.
Now we need to convert the image to grayscale. Why is this necessary? Converting to grey will remove all colour information which is useless for object detection. This will make the analysis easier for opencv. Adding the following line to our script, will create a greysacle image:
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Next step is creating a face classifier. Simpler than you think. The classifier is an algorithm that has been already trained to detect specific objects, in this case faces. The algorithm is trained by processing a lot of images, with and without faces. After processing a huge number of images, the algorithm gathers the rules that help determine how to find a face within an image. You can download the classifier algorithm from this url, and save it in the same folder as your script:
Open and Download the classifier from here
Once you saved the file and called it haarcascade_frontalface_alt2.xml, you can add the following code in your script to create the classifier:
face_classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
Now we are ready to run the face detection analysis on our grey image and find the faces.
faces_rectangles = face_classifier.detectMultiScale(gray_image)
This will return a list of rectangles that surround the faces in our image.
We found the faces. Now all left to do is drawing the rectangles on top of our original image . This way we can visualise the analysis and make sure the algorithm detect the faces correctly.
for (x,y,w,h) in faces: cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) # Draw the rectangle cv2.imshow('Loaded image',image) # Display the original image cv2.waitKey(0) # Program waits for user to press a key cv2.destroyAllWindows() # Close all windows
And here are the results:
These is the full script:
#Loading the image import cv2 image = cv2.imread('sample_image.png') #Convert to gray scale gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Face classifier face_classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') # Analysis faces_rectangles = face_classifier.detectMultiScale(gray_image) # Drawing the rectangles for (x,y,w,h) in faces: cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) # Draw the rectangle cv2.imshow('Loaded image',image) # Display the original image cv2.waitKey(0) # Program waits for user to press a key cv2.destroyAllWindows() # Close all windows
You might encounter the following error: OpenCV !_src.empty() in function ‘cv::cvtColor’ error. The cvtColor function will throw this error when the image received is empty. Therefore you should double check that the image was correctly loaded. Check the file name spelling, and also make sure the image and your script are saved in the same folder.
Hope you enjoy the article. As you can see, opencv makes face detection extremely simple. Happy coding!
Steady pace book with lots of worked examples. Starting with the basics, and moving to projects, data visualisation, and web applications
Unique lay-out and teaching programming style helping new concepts stick in your memory
Great guide for those who want to improve their skills when writing python code. Easy to understand. Many practical examples
Perfect Boook for anyone who has an alright knowledge of Java and wants to take it to the next level.
Excellent read for anyone who already know how to program and want to learn Best Practices
Perfect book for anyone transitioning into the mid/mid-senior developer level
Great book and probably the best way to practice for interview. Some really good information on how to perform an interview. Code Example in Java