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]))
Irum Zahra Awan
  • 276
  • 1
  • 5
  • 16

4 Answers4

5

Should be like this:

crop_img = img_full[d.top():d.bottom(),d.left():d.right()]
Andrey Smorodov
  • 10,649
  • 2
  • 35
  • 42
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)
kjagiello
  • 8,269
  • 2
  • 31
  • 47
Evgeniy
  • 2,481
  • 14
  • 24
  • 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.?? – SaddamBinSyed Jul 04 '19 at 13:48
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)]
Nathan Tuggy
  • 2,237
  • 27
  • 30
  • 38
Ankur Jain
  • 507
  • 3
  • 9
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?

Taufik_TF
  • 134
  • 3
  • 10