Skip to main content

Face Detection

Introduction​

This section learns to use OpenCV to detect faces in an image.

Experiment Objective​

Detect faces in an image and draw rectangular boxes for display.

Experiment Explanation​

Using the cascade classifier method introduced earlier, this section uses the frontal face cascade classifier haarcascade_frontalface_default.xml. The code writing flow is as follows:


Reference Code​

Reference code is as follows:

'''
Experiment Name: Face Detection
Experiment Platform: WalnutPi 2B
'''

import cv2

img = cv2.imread('face1.jpg') # Read the image

# Load the face detection cascade classifier; note that the path must not contain Chinese characters
faceCascade = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')

# Detect all faces
faces = faceCascade.detectMultiScale(img, 1.2)

# Iterate through all face results
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3) # Draw a box around the face

cv2.imshow('result', img) # Display the image

cv2.waitKey() # Wait for any key press
cv2.destroyAllWindows() # Close the window

Experiment Results​

Run the above code on the WalnutPi, and the experimental results are as follows:

front_face_detection

Using USB Camera for Recognition​

By combining the USB camera usage method introduced earlier, you can perform real-time recognition via a USB camera. Reference code is as follows:

Reference Code​

'''
Experiment Name: Face Detection (Using USB Camera)
Experiment Platform: WalnutPi 2B
'''


import cv2, time

# Load the face detection cascade classifier; note that the path must not contain Chinese characters
faceCascade = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')

cam = cv2.VideoCapture(1) # Open the USB camera

# Lowering the resolution can improve recognition speed; can be set to 480x320 or 320x240
cam.set(3,480) # Set capture image width to 480
cam.set(4,320) # Set capture image height to 320

# Calculate FPS (frames per second parameter)
start = 0
end = 0

while True:

start = time.time() # Record start time

retval, img = cam.read() # Read images from the camera in real-time

# Detect all faces
faces = faceCascade.detectMultiScale(img, 1.2)
print(faces)

# Iterate through all face results
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3) # Draw a box around the face


end = time.time() # Record end time

# Calculate FPS (frames per second), result rounded to integer
fps = round(1/(end-start))
print('FPS: ', fps)

# Write text on the image
cv2.putText(img, "FPS: "+ str(fps), (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 5)

cv2.imshow('result', img) # Display the image

key = cv2.waitKey(1) # Window image refresh time is 1 millisecond to prevent blocking
if key == 32: # If the spacebar is pressed, break and exit
break

cam.release() # Close the camera
cv2.destroyAllWindows() # Destroy the window displaying the camera video

Experiment Results​

front_face_detection