Detect faces¶
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.
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.
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()