2016-10-12 13 views
8

dlibで検出された顔を保存するにはどうすればよいですか? 誰かがどのようにしてそれを切り取ることができますか?私は初めてdlibを使用しており、多くの問題を抱えている です。私も検出された顔の でfisherfaceアルゴリズムを実行したいが、私はpridictorに検出された矩形を渡すときに私にタイプエラーを与えている。 この問題で真剣に助けが必要です。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)] 
関連する問題