目的:
- 检测出用户路径下所有的图片的人像特征,保存在指定目录;
- 人像原始特征为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()
可以改进之处:
- 没有指定人脸特征目录的话就自己创造一个目录,目前没有实现这个功能;
- 特殊权限的文件目录不能打开;
- 人脸识别的原始cv2检测器太垃圾,检测出许多非人脸特征,所以如果照片集里有很多非人像的图片就完全没法用啊!
- 非人像特征太多不能作为人脸识别原始数据,请继续筛选;
- 依图片集大小这个程序可能会运行两三个小时;
- 据说编码不能太完美主义,不然会没完没了~
网友评论