使用opencv提取图片中的人脸保存下来

该代码示例使用OpenCV的detectMultiScale方法检测人脸,并对检测到的人脸进行裁剪和缩放。如果检测不到人脸,则将图片移动到另一个文件夹。之后,程序遍历各个子文件夹,对图片进行重命名并保存到一个新的结果文件夹中。
摘要由CSDN通过智能技术生成

目录结构

  • 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文件夹汇集了之前的各个文件夹编号后结果如图

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanmy_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值