2016-10-12 7 views
8

मैं आयत को को क्रॉप करके डीएलआईबी में पता लगाया चेहरा सहेजना चाहता हूं, किसी को भी कोई विचार है कि मैं इसे कैसे फसल कर सकता हूं। मैं पहली बार dlib का उपयोग कर रहा हूं और इतनी सारी समस्याएं हैं। मैं पर फिशरफेस एल्गोरिदम को भी खोजा हुआ चेहरों को चलाने के लिए चाहता हूं लेकिन यह मुझे टाइप त्रुटि देता है जब मैं प्रक्षेपक को पता चला आयताकार पास करता हूं। मुझे इस मुद्दे में गंभीरता से मदद की ज़रूरत है।dlib python में पाए गए चेहरे को सहेजने/फसल कैसे करें

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])) 

उत्तर

5

इस तरह होना चाहिए:

crop_img = img_full[d.top():d.bottom(),d.left():d.right()] 
3

कृपया उत्तर प्राप्त करने के लिए न्यूनतम-कार्यरत नमूना कोड का उपयोग करें।

आपके चेहरे का पता लगाने के बाद - आपके पास एक आयत है। तो आप चित्र काटने के लिए कर सकते हैं और opencv कार्यों साथ सहेजें:

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) 
2

Answer by Andrey अच्छा था, लेकिन यह बढ़त मामलों में जहां मूल आयताकार छवि खिड़की के बाहर आंशिक रूप से याद करते हैं। (हाँ जो dlib के साथ होता है।)

crop_img = img_full[max(0, d.top()): min(d.bottom(), image_height), 
        max(0, d.left()): min(d.right(), image_width)] 
संबंधित मुद्दे