how to save/crop detected faces in dlib python
Asked Answered
U

4

8

i want to save the detected face in dlib by cropping the rectangle do anyone have any idea how can i crop it. i am using dlib first time and having so many problems. i also want to run the fisherface algorithm on the detected faces but it is giving me type error when i pass the detected rectangle to pridictor. i seriously need help in this issue.

import cv2, sys, numpy, os
import dlib
from skimage import io
import json
import uuid
import random
from datetime import datetime
from random import randint
#predictor_path = sys.argv[1]
fn_haar = 'haarcascade_frontalface_default.xml'
fn_dir = 'att_faces'
size = 4
detector = dlib.get_frontal_face_detector()
#predictor = dlib.shape_predictor(predictor_path)
options=dlib.get_frontal_face_detector()
options.num_threads = 4
options.be_verbose = True

win = dlib.image_window()

# Part 1: Create fisherRecognizer
print('Training...')

# Create a list of images and a list of corresponding names
(images, lables, names, id) = ([], [], {}, 0)

for (subdirs, dirs, files) in os.walk(fn_dir):
    for subdir in dirs:
        names[id] = subdir
        subjectpath = os.path.join(fn_dir, subdir)
        for filename in os.listdir(subjectpath):
            path = subjectpath + '/' + filename
            lable = id
            images.append(cv2.imread(path, 0))
            lables.append(int(lable))
        id += 1

(im_width, im_height) = (112, 92)

# Create a Numpy array from the two lists above
(images, lables) = [numpy.array(lis) for lis in [images, lables]]

# OpenCV trains a model from the images

model = cv2.createFisherFaceRecognizer(0,500)
model.train(images, lables)

haar_cascade = cv2.CascadeClassifier(fn_haar)
webcam = cv2.VideoCapture(0)
webcam.set(5,30)
while True:
    (rval, frame) = webcam.read()
    frame=cv2.flip(frame,1,0)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    mini = cv2.resize(gray, (gray.shape[1] / size, gray.shape[0] / size))

    dets = detector(gray, 1)

    print "length", len(dets)

    print("Number of faces detected: {}".format(len(dets)))
    for i, d in enumerate(dets):
        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
            i, d.left(), d.top(), d.right(), d.bottom()))

    cv2.rectangle(gray, (d.left(), d.top()), (d.right(), d.bottom()), (0, 255, 0), 3)


    '''
        #Try to recognize the face
        prediction  = model.predict(dets)
        print "Recognition Prediction" ,prediction'''





    win.clear_overlay()
    win.set_image(gray)
    win.add_overlay(dets)

if (len(sys.argv[1:]) > 0):
    img = io.imread(sys.argv[1])
    dets, scores, idx = detector.run(img, 1, -1)
    for i, d in enumerate(dets):
        print("Detection {}, score: {}, face_type:{}".format(
            d, scores[i], idx[i]))
Ulbricht answered 12/10, 2016 at 21:39 Comment(0)
S
5

Should be like this:

crop_img = img_full[d.top():d.bottom(),d.left():d.right()]
Sooty answered 13/10, 2016 at 15:35 Comment(0)
T
4

Please use minimal-working sample code to get answers faster.

After you have detected face - you have a rect. So you can crop image and save with opencv functions:

    img = cv2.imread("test.jpg")
    dets = detector.run(img, 1)
    for i, d in enumerate(dets):
        print("Detection {}, score: {}, face_type:{}".format(
            d, scores[i], idx[i]))
        crop = img[d.top():d.bottom(), d.left():d.right()]
        cv2.imwrite("cropped.jpg", crop)
Thermoscope answered 13/10, 2016 at 11:21 Comment(1)
Hi there. How can I find the closest face to the camera using? I am using width and height value to check which rect is bigger? In above code which one is width and Height.??Shock
C
3

Answer by Andrey was good but it misses edge cases where original rectangle is partially outside the image window. (Yes that happens with dlib.)

crop_img = img_full[max(0, d.top()): min(d.bottom(), image_height),
                    max(0, d.left()): min(d.right(), image_width)]
Capeskin answered 31/5, 2017 at 1:47 Comment(0)
R
0
# Select one of the haarcascade files:
#   haarcascade_frontalface_alt.xml  
#   haarcascade_frontalface_alt2.xml
#   haarcascade_frontalface_alt_tree.xml
#   haarcascade_frontalface_default.xml
#   haarcascade_profileface.xml

I remember haarcascade_frontalface_alt.xml is the best one?

Rucksack answered 13/4, 2018 at 6:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.