目录结构
- people_face
- 1.jpg
- 2.jpg
import cv2
import os
import glob
size_m = 48
size_n = 48
def detect(img, cascade):
rects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(80, 60), flags=cv2.CASCADE_SCALE_IMAGE) # 这几个参数需要调
if len(rects) == 0:
return []
rects[:, 2:] += rects[:, :2]
return rects
cascade = cv2.CascadeClassifier("D:\software_learning\deeplearning\Anaconda\Anaconda3.7\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml") # 找到替换自己电脑上的
#imglist = glob.glob(r"E:\people_face\Npor\forProcce\fer-2013\disguest3\\")
imglist = r'E:\people_face\\' # 待处理人脸图像,下一次可以替换no_result把效果不好的图片筛选出来重新调参提取人脸
for list in os.listdir(imglist):
all_path = os.path.join(imglist,list)
img = cv2.imread(all_path)
print(all_path)
# 少了个rgb
dst = img
rects = detect(dst, cascade)
path = all_path.split("\\")
print(path) # E:\people_face\\1.jpg
if len(rects): # rects不为空则检测到人脸
for x1, y1, x2, y2 in rects:
roi = dst[y1:y2,x1:x2] # 剪切
img_roi = roi
re_roi = cv2.resize(img_roi, (size_m, size_n))
reslut_path = r"E:\people_face\\result\\"
print(path[2][:-4]) # 截取到图片名,因为是第2个块,后缀名是.jpg,4位['E:', 'people_face', '', '1.jpg']
# cv2.imwrite("{}/{}_{}.jpg".format(f, path[1], path[2]), re_roi)
# 将ROI转换为灰度图像,不转直接re_roi
gray_roi = cv2.cvtColor(re_roi, cv2.COLOR_BGR2GRAY)
cv2.imwrite(reslut_path+path[3][:-4]+".jpg",gray_roi)
else: # 没有切的人脸出来,放另一个文件夹
os.rename(all_path, r"E:\people_face\no_result\\"+path[3][:-4]+'.jpg') # 换路径 src,dist路径
最后收集各个部分的文件图片,重新排序后保存到result
import os
import glob
import shutil
# 定义文件夹路径和新的起始编号
folder_path = r"E:\people_face"
result_path = "./result"
new_name = 1
# 遍历文件夹a下的所有子文件夹
for subdir in os.listdir(folder_path):
# 获取当前子文件夹中的所有图片
files = glob.glob(os.path.join(folder_path, subdir, "*.jpg"))
files.sort() # 排序
# 遍历当前子文件夹中的每张图片,重命名并存储到result文件夹中
for old_file in files:
new_file = os.path.join(result_path, f"{new_name}.jpg")
shutil.copy(old_file, new_file)
new_name += 1
最后result文件夹汇集了之前的各个文件夹编号后结果如图