Source code for cascade_classifcation

import cv2
import pandas as pd
import os
import shutil


[docs]def create_folder(folder): if os.path.exists(folder): shutil.rmtree(folder, ignore_errors=True) os.mkdir(folder)
[docs]def find_face(image): """Image has to be grayscale. Returns largest face found.""" face_cascade = cv2.CascadeClassifier('src/haar_xml/haarcascade_frontalface_default.xml') # Detect face faces = face_cascade.detectMultiScale( image, scaleFactor=1.05, minNeighbors=8, minSize=(55, 55), flags=cv2.CASCADE_SCALE_IMAGE ) if len(faces) == 0: return None, None, None, None # Find largest detected face largest = faces[0] largest_size = largest[2] * largest[3] for (x, y, w, h) in faces[1:]: size = w * h if size > largest_size: largest = (x, y, w, h) largest_size = size x, y, w, h = largest return x, y, w, h
if __name__ == '__main__': df = pd.read_csv('../data/users.csv') # Create cascade classifiers feature_cascade = cv2.CascadeClassifier('haar_xml/haarcascade_smile.xml') # feature_cascade = cv2.CascadeClassifier('haar_xml/haarcascade_eye_tree_eyeglasses.xml') # Create folders for images based on if feature is detected create_folder('../data/haar_testing') feature_folder = '../data/haar_testing/detected' frown_folder = '../data/haar_testing/not_detected' create_folder(feature_folder) create_folder(frown_folder) for index, row in df[:10].iterrows(): # Read image and convert to grayscale im = cv2.imread(row.image_path) gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) x, y, w, h = find_face(gray) if x is None: continue # Draw rectangle around face cv2.rectangle(im, (x, y), (x + w, y + h), (0, 0, 255), 2) # Get face area roi_gray = gray[y:y + h, x:x + w] roi_color = im[y:y + h, x:x + w] # Detect feature in face area featuers = feature_cascade.detectMultiScale( roi_gray, scaleFactor= 2.1, minNeighbors=22, minSize=(25, 25), flags=cv2.CASCADE_SCALE_IMAGE ) # Draw smiles for (x2, y2, w, h) in featuers: im_x = x + x2 im_y = y + y2 cv2.rectangle(im, (im_x, im_y), (im_x + w, im_y + h), (255, 0, 0), 1) # resized = cv2.resize(im, (512, 512)) if len(featuers) > 0: cv2.imwrite(os.path.join(feature_folder, os.path.split(row.image_path)[1]), im) else: cv2.imwrite(os.path.join(frown_folder, os.path.split(row.image_path)[1]), im)