如何在 dlib python 中保存/裁剪检测到的人脸
Posted
技术标签:
【中文标题】如何在 dlib python 中保存/裁剪检测到的人脸【英文标题】:how to save/crop detected faces in dlib python 【发布时间】:2017-02-21 20:35:18 【问题描述】:我想通过裁剪矩形将检测到的人脸保存在 dlib 中 任何人都知道我该如何裁剪它。我第一次使用 dlib 有这么多问题。我也想运行fisherface算法 检测到的面孔但是当我将检测到的矩形传递给pridictor时它给了我类型错误。 我在这个问题上非常需要帮助。
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]))
【问题讨论】:
【参考方案1】:# 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
我记得 haarcascade_frontalface_alt.xml 是最好的吗?
【讨论】:
【参考方案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)]
【讨论】:
【参考方案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)
【讨论】:
您好。如何找到离相机最近的脸?我正在使用宽度和高度值来检查哪个矩形更大?在上面的代码中,哪一个是宽度和高度。??【参考方案4】:应该是这样的:
crop_img = img_full[d.top():d.bottom(),d.left():d.right()]
【讨论】:
以上是关于如何在 dlib python 中保存/裁剪检测到的人脸的主要内容,如果未能解决你的问题,请参考以下文章
如何将从(对象检测)裁剪的检测到的面部保存到其特定创建的文件夹中?