#任务1:构建数据集,通过自动化手段批量处理文件数据
#工作流程:
#(1)运行人脸检测代码自动截取人脸,制作人脸数据集
#(2)运行图像批量读取并重命名代码将文件名改为自己的名字拼音,编号从001开始,如liming001。
代码:
##工作流程(1):运行人脸检测代码自动截取人脸,制作人脸数据集
import cv2
import os
# 打开摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 设置保存图像的文件夹
output_dir = 'face_images'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 人脸检测器(这里使用OpenCV自带的Cascade分类器)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 采集图像的计数器
image_counter = 0
try:
while True:
# 读取一帧图像
ret, frame = cap.read()
# 如果读取成功
if ret:
# 将图像转换为灰度图,因为人脸检测通常在灰度图上进行
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 遍历检测到的人脸
for (x, y, w, h) in faces:
# 在原图上绘制矩形框
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 截取人脸区域并保存为图像文件
face_img = frame[y:y+h, x:x+w]
image_filename = os.path.join(output_dir, f'face_{image_counter:04d}.jpg')
cv2.imwrite(image_filename, face_img)
# 更新计数器
image_counter += 1
# 如果只需要采集一定数量的人脸图像,可以在这里设置条件退出循环
# if image_counter >= 10:
# break
# 显示图像
cv2.imshow('Camera', frame)
# 按下'q'键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
print("无法读取摄像头图像")
break
finally:
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
##工作流程(2):运行图像批量读取并重命名代码将文件名改为自己的名字拼音,编号从001开始,如lifei001
import cv2#openCV包,用于机器视觉
import os#os包是标准库中用于操作系统交互的核心工具,如文件与目录管理、系统信息与进程管理
import keyboard#监听键盘输入、模拟按键、记录和回放宏
index=1
folder_path='face_images'#改成你自己的路径
for filename in sorted(os.listdir(folder_path)):#按文件名排序,按顺序获取文件名;sorted是排序函数
if filename.lower().endswith('.jpg'):#.lower() 将文件名全部转为小写.endswith('.jpg') 检查处理后的字符串是否以指定后缀结尾
file_path = os.path.join(folder_path, filename)#os.path.join:智能拼接多个路径片段,自动适配操作系统的路径分隔符
# 读取图像(BGR格式)
#img = cv2.imread(file_path)#读取对应图像
#cv2.imshow(filename, img)#显示图像
#key = cv2.waitKey(500) # 等待指定时间500ms或按键
#file_ext = os.path.splitext(filename).lower() # 保留原始扩展名
new_name = f"{"meinv_"}{index:0{3}d}{'.jpg'}"#f"表示字符串变量组,{字符串变量},index:0{3}d表示序号有3位
index=index+1
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
# 避免覆盖现有文件
if os.path.exists(new_path):
print(f"警告:跳过 {filename},目标文件已存在")
continue
os.rename(old_path, new_path)
print(f"已重命名:{filename} -> {new_name}")
cv2.destroyAllWindows()#关闭所有弹窗
if keyboard.is_pressed('q'):
print("检测到q键,程序退出")
break
注意装载导入包:
(1)pip install keyboard
(2)pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python