人脸检测 二

2018-04-30  本文已影响29人  圣_狒司机

目的:

  1. 检测出用户路径下所有的图片的人像特征,保存在指定目录;
  2. 人像原始特征为100*100 图片;

代码特点:

用自制的filewalk函数遍历用户目录,并跟上了文件操作回调函数,使得代码阅读起来更一目了然。

完整代码:

import os
import matplotlib.pyplot as plt
import numpy as np
from cv2 import cv2
from skimage import color, draw, io, transform

face_cascade=cv2.CascadeClassifier()
face_cascade.load(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

def feature_model(full_path_file,detected_path=r'C:\Users\super\Desktop\detected'):
    try:img = io.imread(full_path_file)
    except:return 0
    path,file = os.path.split(full_path_file)
    file_name,file_postfix = os.path.splitext(file)
    gray = np.array(color.rgb2gray(img)*256,dtype='uint8')
    faces=face_cascade.detectMultiScale(gray)
    for index,face in enumerate(faces):
        x,y,w,h = face
        face_detected = img[y:y+h,x:x+w,:]
        face_detected = transform.resize(face_detected,(100, 100),mode='reflect')
        full_path_detected_file = os.path.join(detected_path,file_name+'_%s%s'%(index,file_postfix))
        plt.imsave(full_path_detected_file,face_detected)

def walk(path,callback=print):
    files = os.listdir(path)
    for file in files:
        try:
            if os.path.isdir(os.path.join(path,file)):
                walk(os.path.join(path,file),callback)
            else:
                print(os.path.join(path,file))
                callback(os.path.join(path,file))
        except:pass

def main():
    walk(path,feature_model)

if __name__ == "__main__":
    path = r'C:\Users\super'
    main()

可以改进之处:

  1. 没有指定人脸特征目录的话就自己创造一个目录,目前没有实现这个功能;
  2. 特殊权限的文件目录不能打开;
  3. 人脸识别的原始cv2检测器太垃圾,检测出许多非人脸特征,所以如果照片集里有很多非人像的图片就完全没法用啊!
  4. 非人像特征太多不能作为人脸识别原始数据,请继续筛选;
  5. 依图片集大小这个程序可能会运行两三个小时;
  6. 据说编码不能太完美主义,不然会没完没了~

效果:

效果
上一篇下一篇

猜你喜欢

热点阅读