在做人脸识别时需要录入人脸数据,数据需要一个文件夹装一个人的照片,并且以人命来命名文件夹名,还有就是每个人只需存一张照片即可。
import cv2
import os
import shutil
# cv2 不能保存有中文路径,所以先将文件命名为 new ,保存成功后再改回中文名
# 拍照,以姓名命名文件夹名
def take_photo(filePath, imgName):
cap = cv2.VideoCapture(0)
name = input("请输入你的姓名('q' 退出):")
if name == 'q':
print('拍照结束!')
return 0
print('开始拍照啦!按下空格键拍照(esc退出)')
while True:
success, img = cap.read()
cv2.imshow('photo', img)
key = cv2.waitKey(1)
if key == ord(' '):
# 先使用英文名
en_namePath = os.path.join(filePath, 'new')
# 实际文件名
namePath = os.path.join(filePath, name)
# 临时图片全路径
imgPath = os.path.join(en_namePath, imgName)
try:
# 建立文件夹
os.makedirs(en_namePath)
except FileExistsError:
# 已存在就跳过
pass
try:
len_path = len(os.listdir(namePath))
except FileNotFoundError:
os.makedirs(namePath)
len_path = len(os.listdir(namePath))
if len_path == 0:
cv2.imwrite(imgPath, img)
# 先删除临时建立的实际文件名
shutil.rmtree(namePath)
# 将英文文件名改回真正的名字
os.rename(en_namePath, namePath)
print(f'图像已保存到“{namePath}”中!')
else:
if input('只能存一张照片,是否需要替换(y/n):') == 'y':
cv2.imwrite(imgPath, img)
# 先删除原有的实际文件名
shutil.rmtree(namePath)
os.rename(en_namePath, namePath)
print(f'替换成功!图像已保存到“{namePath}”中!')
else:
# 删去临时文件夹 new
shutil.rmtree(en_namePath)
name = input("请输入你的姓名('q' 退出):")
if name == 'q':
break
print('开始拍照啦!按下空格键拍照(esc退出)')
continue
elif key == 27:
break
print('拍照结束!')
if __name__ == '__main__':
# 图片存储位置的根路径
filepath = './data/dataBS'
# 保存的图片名
imgName = '1.png'
take_photo(filePath=filepath, imgName=imgName)