In [ ]:
#detect faces from image files and save faces to disk
#2017.8.1

In [11]:
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import os
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

In [2]:
def detectFaces(image_name):
    img = cv2.imread(image_name)
    face_cascade = cv2.CascadeClassifier('C:/Users/Max/Anaconda3/pkgs/opencv3-3.1.0-py35_0/Library/etc/haarcascades/haarcascade_frontalface_default.xml')
    if img.ndim == 3:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
        gray = img
    faces = face_cascade.detectMultiScale(gray,1.2,5)#检测窗口的大小
    result = []
    for (x,y,width,height) in faces:
        result.append((x,y,x+width,y+height))
    return result

In [3]:
def saveFacles(image):
    faces = detectFaces(image)
    if faces:
        #save_dir = 'image.split('.')[0]+"_faces"'
        save_dir = 'D:/faces'
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        count = 0
        for (x1, y1, x2, y2) in faces:
            file_name = os.path.join(save_dir,str(count)+".jpg")
            Image.open(image).crop((x1,y1,x2,y2)).save(file_name)
            count += 1

In [48]:
def drawFaces(image):
    faces = detectFaces(image)
    if faces:
        img = Image.open(image)
        draw_instance = ImageDraw.Draw(img)
        for(x1,y1,x2,y2) in faces:
            draw_instance.rectangle((x1,y1,x2,y2), outline=(255,0,0))
    #img = mpimg.imread(image)
    plt.imshow(img)
    plt.axis('off')#是否显示坐标
    plt.show()

In [52]:
#code here enable process many images
image = 'C:/Users/Max/Pictures/timg.jpg'

In [53]:
drawFaces(image)



In [54]:
saveFacles(image)

In [55]:
#result
img = mpimg.imread(image)
plt.imshow(img)
plt.axis('off')#是否显示坐标
plt.show()

imagename = 'D:/faces/0.jpg'
im = mpimg.imread(imagename)
plt.imshow(im)
plt.axis('off')#是否显示坐标
plt.show()