最近项目需要,从百度,bing 爬取图片,并对图片中人脸进行扣取,然后扣取的人脸作为机器学习的样本数据进行人工标注,图片爬取了人工筛选比较耗时,于是查找资料发现opencv库中人脸识别可以实现该需求,识别率还可以。
#-*-coding:utf8-*-
import os
import cv2
import time
import shutil
def getAllPath(dirpath, *suffix):
PathArray = []
for r, ds, fs in os.walk(dirpath):
for fn in fs:
if os.path.splitext(fn)[1] in suffix:
fname = os.path.join(r, fn)
PathArray.append(fname)
return PathArray
#从源路径中读取所有图片放入一个list,然后逐一进行检查,把其中的脸扣下来,存储到目标路径中
def readPicSaveFace(sourcePath,targetPath,invalidPath,*suffix):
try:
ImagePaths=getAllPath(sourcePath, *suffix)
#对list中图片逐一进行检查,找出其中的人脸然后写到目标文件夹下
count = 1
# haarcascade_frontalface_alt.xml为库训练好的分类器文件,下载opencv,安装目录中可找到
face_cascade = cv2.CascadeClassifier('C:\Users\lizhiliang\Downloads\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml')
for imagePath in ImagePaths:
img = cv2.imread(imagePath)
if type(img) != str:
faces = face_cascade.detectMultiScale(img, 1.1, 5)
if len(faces):
for (x, y, w, h) in faces:
# 设置人脸宽度大于128像素,去除较小的人脸
if w>=128 and h>=128:
# 以时间戳和读取的排序作为文件名称
listStr = [str(int(time.time())), str(count)]
fileName = ''.join(list