import tkinter as tk
from tkinter import filedialog
import cv2
import os
import dlib
import io
import numpy as np
from tkinter import messagebox
# system运行shell命令(发生中文乱码情况,这是字符编码问题,默认字符编码是GBK这个中文编码,但是很奇怪会乱码。解决方案1.使用chcp 65001将编码改变成utf-8)
os.system('chcp 65001')
os.system('dir')
# 创建主窗口
root = tk.Tk()
root.title("证件照裁剪工具")
# 设置窗口大小
root.geometry("400x200")
# 创建标签
label = tk.Label(root, text="选择输入文件夹:")
label.pack()
# 创建输入文件夹路径文本框
input_folder_var = tk.StringVar()
input_folder_entry = tk.Entry(root, textvariable=input_folder_var)
input_folder_entry.pack()
# 创建按钮,用于选择输入文件夹
def browse_input_folder():
folder_selected = filedialog.askdirectory()
input_folder_var.set(folder_selected)
input_folder_button = tk.Button(root, text="浏览", command=browse_input_folder)
input_folder_button.pack()
# 创建标签
label = tk.Label(root, text="选择输出文件夹:")
label.pack()
# 创建输出文件夹路径文本框
output_folder_var = tk.StringVar()
output_folder_entry = tk.Entry(root, textvariable=output_folder_var)
output_folder_entry.pack()
# 创建按钮,用于选择输出文件夹
def browse_output_folder():
folder_selected = filedialog.askdirectory()
output_folder_var.set(folder_selected)
output_folder_button = tk.Button(root, text="浏览", command=browse_output_folder)
output_folder_button.pack()
# 创建按钮,用于执行裁剪操作
def crop_photos():
input_folder = input_folder_var.get()
output_folder = output_folder_var.get()
# 添加裁剪代码,将您之前的裁剪代码放在这里
# 加载Caffe模型
model_file = 'deploy.prototxt'
weights_file = 'res10_300x300_ssd_iter_140000.caffemodel'
net = cv2.dnn.readNetFromCaffe(model_file, weights_file)
# 确保输出文件夹存在,如果不存在则创建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
if input_folder==output_folder:
result = messagebox.askyesno('注意', '输入与输出目录相同,请换一个输出目录,防止覆盖原文件!')
return
# 处理输入文件夹中的每张照片
for filename in os.listdir(input_folder):
if filename.lower().endswith(".jpg"): # 忽略大小写,仅处理".jpg"后缀的文件
print("Crop:"+filename)
# 读取原始图片
#original_image = cv2.imread(os.path.join(input_folder, filename))
original_image = cv2.imdecode(np.fromfile(os.path.join(input_folder, filename),dtype=np.uint8),-1)
# 将图片转换为blob以输入Caffe模型
blob = cv2.dnn.blobFromImage(cv2.resize(original_image, (300, 300)), 1.0, (300, 300), (104, 177, 123))
# 将blob输入模型
net.setInput(blob)
# 进行前向传播
detections = net.forward()
central_face = None # 用于存储中央人像
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5: # 可以根据置信度阈值调整
x1, y1, x2, y2 = map(int, detections[0, 0, i, 3:7] * [original_image.shape[1], original_image.shape[0], original_image.shape[1], original_image.shape[0]])
# 计算人脸中心坐标
center_x, center_y = (x1 + x2) // 2, (y1 + y2) // 2
# 检查人脸是否在图像中央
if abs(center_x - original_image.shape[1] // 2) <= original_image.shape[1] // 4 and abs(center_y - original_image.shape[0] // 2) <= original_image.shape[0] // 4:
# 如果人脸位于中央,将其保存为中央人像
central_face = original_image[y1:y2, x1:x2]
break
if central_face is not None:
# 处理中央人像,例如裁剪、修改背景等
# 计算人脸宽度和高度
face_width = x2 - x1
face_height = y2 - y1
# 根据脸型大小动态调整裁剪区域的大小
target_width = int(face_width * 1.8) # 脸型大的裁剪范围大一些
target_height = int(face_height * 2)
target_width=max(int(target_height*5/7),target_width)
target_height=max(int(target_width*7/5),target_height)
# 计算裁剪区域的中心坐标
center_x, center_y = (x1 + x2) // 2, (y1 + y2) // 2
# 根据脸型大小微调裁剪区域
#if center_y - target_height // 2 > 0:
#center_y -= target_height // 50 # 向上微调
# 计算裁剪区域的左上角和右下角坐标,使人脸位于中央
crop_x1 = max(center_x - target_width // 2, 0)
crop_x2 = min(center_x + target_width // 2, original_image.shape[1])
crop_y1 = max(center_y - target_height // 2, 0)
crop_y2 = min(center_y + target_height // 2, original_image.shape[0])
# 裁剪并调整人脸大小为标准尺寸
resized_face = cv2.resize(original_image[crop_y1:crop_y2, crop_x1:crop_x2], (target_width, target_height))
# 保存证件照,保持文件后缀名不变
output_filename = os.path.join(output_folder, filename)
_,image_data = cv2.imencode('.jpg',resized_face)
with open(output_filename,'wb') as f:
f.write(image_data)
print("End!")
crop_button = tk.Button(root, text="开始裁剪", command=crop_photos)
crop_button.pack()
# 启动GUI事件循环
root.mainloop()
批量裁剪证件照,用在学生学籍、书法考级等场合,python编写,加了图片中心头像检测,实用高效
需积分: 3 104 浏览量
2023-10-12
07:58:31
上传
评论
收藏 10.68MB ZIP 举报
zlfpass
- 粉丝: 1
- 资源: 6
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈