Detect faces

face/face1.png
import cv2 as cv

print(cv.__version__)
RED = (0, 0, 255)

img = cv.imread('family2.jpg')
cv.imshow('window', img)

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('window2', gray)

path = 'cascades/haarcascade_frontalface_default.xml'
face_detector = cv.CascadeClassifier(path)

face_rects = face_detector.detectMultiScale(gray,
        scaleFactor=1.1,
        minNeighbors=5, 
        minSize=(30, 30),
        flags = cv.CASCADE_SCALE_IMAGE)

print(f'found {len(face_rects)} face(s)')

for rect in face_rects:
    cv.rectangle(img, rect, RED, 2)

cv.imshow('window', img)
cv.waitKey(0)

Use trackbars to select parameters

The cascade detector allows to detect faces in an image.

../_images/face2.png
import cv2 as cv

print(cv.__version__)
RED = (0, 0, 255)
scaleFactor = 1.1
minNeighbors = 5
minSize = (30, 30)

def detect():
    rects = face_detector.detectMultiScale(gray, 
        scaleFactor=scaleFactor,
        minNeighbors=minNeighbors, 
        minSize=minSize, 
        flags=cv.CASCADE_SCALE_IMAGE)

    print(f'found {len(rects)} face(s)')

    img = img0.copy()
    for rect in rects:
        cv.rectangle(img, rect, RED, 2)
    cv.imshow('window', img)

def trackbar(x):
    global minSize, minNeighbors, scaleFactor
    i = cv.getTrackbarPos('size','window')
    d = (24, 30, 60, 120)[i]
    minSize = (d, d)
    
    n = cv.getTrackbarPos('neighbors','window') + 1
    minNeighbors = n

    i = cv.getTrackbarPos('scale','window')
    s = (1.05, 1.1, 1.4, 2)[i]
    scaleFactor
    
    text = f'minNeighbors={n}, minSize={d}, scaleFactor={s}'
    cv.displayOverlay('window', text)
    detect()

img0 = cv.imread('family2.jpg')
img = img0.copy()
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

path = 'cascades/haarcascade_frontalface_default.xml'
face_detector = cv.CascadeClassifier(path)

detect()

cv.createTrackbar('neighbors', 'window', 0, 10, trackbar)
cv.createTrackbar('size', 'window', 0, 3, trackbar)
cv.createTrackbar('scale', 'window', 0, 3, trackbar)
cv.waitKey(0)

Video face detection

Now let’s use the video camera to do face detection.

../_images/face3.png
import cv2 as cv
import numpy as np
import time

path = 'cascades/haarcascade_frontalface_default.xml'
face_detector = cv.CascadeClassifier(path)

def detect():
    rects = face_detector.detectMultiScale(gray_s, 
        scaleFactor=1.1,
        minNeighbors=5, 
        minSize=(30, 30), 
        flags=cv.CASCADE_SCALE_IMAGE)

    for rect in rects:
        cv.rectangle(gray_s, rect, 255, 2)

cap = cv.VideoCapture(0)
t0 = time.time()

M = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
size = (640, 360)

while True:
    # Capture frame-by-frame
    ret, frame = cap.read()

    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    gray_s = cv.warpAffine(gray, M, size)

    detect()
    
    cv.imshow('window', gray_s)
    t = time.time()
    cv.displayOverlay('window', f'time={t-t0:.3f}')
    t0 = t

    if cv.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv.destroyAllWindows()