总体思路为:读取各个文件夹里面的图片,根据自己的选择,将自己想要得到的头像的颜色,通过opencv剪切下来,并且根据这个文件夹的名字生成相对应的文件来装图片,图片的名字是根据时间戳来确定的 下面是代码:
import cv2 import os import time # 分类器,设置为全局变量 face_cascade = cv2.CascadeClassifier("D:\\face_data\\opencv_testing_mechanism\\da_face\\haarcascade_frontalface_alt.xml") size_data = 64 #将他默认为64大小的 save_add = "D:\\face_data\\black_photo" def read_address(): # 读取地址,并且根据相对应的需求修改图片 target_add = "D:\\face_data\\many_photo" # 读取文件夹 floder_name_list = os.listdir(target_add) # print(floder_name_list) for floder_name in floder_name_list: floder_add_str = target_add +"\\"+ floder_name # 创建图片的地址 save_floder_add = save_add+"\\"+ floder_name isExist = os.path.exists(save_floder_add) if not isExist: os.makedirs(save_floder_add) else: print("文件已经存在了") return print(floder_name+"设置成黑白的头像或者彩色的头像") demand_data = input(floder_name+"设置成黑白头像的输入black,设置成彩色的头像的输入colour:") if demand_data=="black": modify_photo_black_and_white(floder_add_str,save_floder_add) if demand_data=="colour": modify_photo_colour(floder_add_str,save_floder_add) if demand_data != "black" and demand_data != "colour": print("请重新输入正确的需求") while(1): demand_data = input(floder_name + "设置成黑白头像的输入black,设置成彩色的头像的输入colour:") if demand_data == "black": modify_photo_black_and_white(floder_add_str,save_floder_add) break elif demand_data == "colour": modify_photo_colour(floder_add_str,save_floder_add) break else: print("请重新输入正确的需求!") return def modify_photo_black_and_white(floder_add_str,save_floder_add): # 将图片修改为黑白图片 # 读取文件里面的所有的图片的地址 photo_name_list = os.listdir(floder_add_str) # print(photo_name_list) # 通过循环设置图片的大小和灰度 for photo_name in photo_name_list: photo_name_add = floder_add_str+"\\"+photo_name # print(photo_name_add) photo_data = cv2.imread(photo_name_add) # print(photo_data) intercept_photo(photo_data,save_floder_add) return def intercept_photo(photo_data,save_floder_add): # 剪切成黑白色的 gray = cv2.cvtColor(photo_data,cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: face = cv2.resize(gray[y:(y+h),x:(x+w)],(size_data,size_data)) # print(face) save_photo(face,save_floder_add) def modify_photo_colour(floder_add_str,save_floder_add): print("将图片修改为彩色的图片") # 读取文件里面的所有的图片的地址 photo_name_list = os.listdir(floder_add_str) # print(photo_name_list) # 通过循环设置图片的大小和灰度 for photo_name in photo_name_list: photo_name_add = floder_add_str + "\\" + photo_name # print(photo_name_add) photo_data = cv2.imread(photo_name_add) # print(photo_data) intercept_photo_color(photo_data, save_floder_add) return def intercept_photo_color(photo_data, save_floder_add): # 这个是剪切诚彩色的 gray = cv2.cvtColor(photo_data, cv2.COLOR_BGR2BGRA) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: face = cv2.resize(gray[y:(y + h), x:(x + w)], (size_data, size_data)) # print(face) save_photo(face, save_floder_add) def save_photo(face,save_floder_add): # 保存图片 photo_name = str(int(time.time())) cv2.imwrite(save_floder_add+"\\"+photo_name+".jpg",face) if __name__ == "__main__": str_size_data = input("请输入您想要生成的图片的大小像素,注意必须是整数:") try: size_data = int(str_size_data) except ValueError: print("请输入整数") while (1): str_size_data = input("请输入您想要生成的图片的大小像素,注意必须是整数:") try: size_data = int(str_size_data) except ValueError: print("请输入整数") else: break read_address()