Python与opencv实现自动人脸捕捉

Python与opencv实现自动人脸捕捉
撰写不易请您珍惜❤pythonimport cv2import osfrom datetime import datetimeclass FaceCapture:def __init__(self, save_dircaptured_faces):初始化人脸捕捉器:param save_dir: 保存图片的文件夹self.save_dir save_dirif not os.path.exists(save_dir):os.makedirs(save_dir)# 加载预训练的人脸检测模型self.face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)# 初始化摄像头self.cap cv2.VideoCapture(0)if not self.cap.isOpened():raise Exception(无法打开摄像头)# 设置摄像头参数可选self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)self.frame_count 0self.face_count 0def detect_faces(self, frame):检测帧中的人脸:param frame: 输入图像:return: 检测到的人脸列表和绘制了矩形的图像gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces self.face_cascade.detectMultiScale(gray,scaleFactor1.1,minNeighbors5,minSize(30, 30))# 在图像上绘制矩形for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2)# 添加文字标签cv2.putText(frame, Face, (x, y-10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)return faces, framedef save_face(self, frame, faces):保存检测到的人脸:param frame: 原始图像:param faces: 人脸位置列表for i, (x, y, w, h) in enumerate(faces):# 提取人脸区域face_roi frame[y:yh, x:xw]# 生成文件名包含时间戳timestamp datetime.now().strftime(%Y%m%d_%H%M%S)filename fface_{timestamp}_{i1}.jpgfilepath os.path.join(self.save_dir, filename)# 保存图片cv2.imwrite(filepath, face_roi)self.face_count 1print(f已保存人脸: {filename})def run(self, auto_saveTrue, save_interval30):运行人脸捕捉主循环:param auto_save: 是否自动保存:param save_interval: 自动保存间隔帧数print(按 q 键退出)print(按 s 键手动保存当前检测到的人脸)print(按 r 键重置计数器)while True:ret, frame self.cap.read()if not ret:print(无法获取摄像头画面)breakself.frame_count 1# 检测人脸faces, display_frame self.detect_faces(frame.copy())# 显示检测到的人脸数量cv2.putText(display_frame, fFaces: {len(faces)}, (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(display_frame, fSaved: {self.face_count}, (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 自动保存if auto_save and len(faces) 0 and self.frame_count % save_interval 0:self.save_face(frame, faces)# 显示画面cv2.imshow(Face Capture, display_frame)# 键盘控制key cv2.waitKey(1) 0xFFif key ord(q):breakelif key ord(s) and len(faces) 0:self.save_face(frame, faces)elif key ord(r):self.face_count 0print(计数器已重置)self.cleanup()def cleanup(self):清理资源self.cap.release()cv2.destroyAllWindows()print(f程序结束共保存了 {self.face_count} 张人脸图片)# 使用示例if __name__ __main__:try:# 创建捕捉器实例capturer FaceCapture(save_dirmy_faces)# 运行捕捉# auto_save: 自动保存, save_interval: 每30帧保存一次capturer.run(auto_saveTrue, save_interval30)except Exception as e:print(f发生错误: {e})使用说明1. 安装依赖bashpip install opencv-python2. 运行程序bashpython face_capture.py3. 控制键· q: 退出程序· s: 手动保存当前检测到的人脸· r: 重置保存计数器4. 高级版本带更多人脸检测选项pythonimport cv2import numpy as npfrom datetime import datetimeclass AdvancedFaceCapture:def __init__(self):# 使用多种检测器提高准确率self.face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)self.profile_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_profileface.xml)self.eye_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_eye.xml)# 初始化摄像头self.cap cv2.VideoCapture(0)self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)self.saved_count 0def detect_faces_advanced(self, frame):增强版人脸检测包含侧脸和眼睛检测gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 正面人脸检测faces self.face_cascade.detectMultiScale(gray, 1.1, 5, minSize(50, 50))# 侧脸检测profile_faces self.profile_cascade.detectMultiScale(gray, 1.1, 5, minSize(50, 50))all_faces list(faces) list(profile_faces)# 检测眼睛用于验证人脸eyes self.eye_cascade.detectMultiScale(gray, 1.1, 5)# 绘制检测结果for (x, y, w, h) in all_faces:cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2)for (x, y, w, h) in eyes:cv2.rectangle(frame, (x, y), (xw, yh), (255, 0, 0), 1)return all_faces, frame, eyesdef run(self):while True:ret, frame self.cap.read()if not ret:breakfaces, display_frame, eyes self.detect_faces_advanced(frame)# 显示统计信息cv2.putText(display_frame, fFaces: {len(faces)}, (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)cv2.putText(display_frame, fEyes: {len(eyes)}, (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)cv2.putText(display_frame, fSaved: {self.saved_count}, (10, 90),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)cv2.imshow(Advanced Face Capture, display_frame)key cv2.waitKey(1) 0xFFif key ord(q):breakelif key ord(s) and len(faces) 0:# 保存第一个检测到的人脸x, y, w, h faces[0]face_img frame[y:yh, x:xw]filename fface_{datetime.now().strftime(%Y%m%d_%H%M%S)}.jpgcv2.imwrite(filename, face_img)self.saved_count 1print(f已保存: {filename})self.cap.release()cv2.destroyAllWindows()if __name__ __main__:capturer AdvancedFaceCapture()capturer.run()功能1. 实时人脸检测使用Haar级联分类器2. 自动保存可设置保存间隔3. 手动控制支持手动保存和重置4. 多种检测支持正面脸和侧脸检测5. 眼睛检测验证人脸检测准确性6. 保存统计显示已保存的人脸数量注意事项· 确保摄像头正常工作· 光线充足时检测效果更好· 可以根据需要调整 scaleFactor 和 minNeighbors 参数· 保存的图片存储在程序运行目录下这个程序适合用于人脸采集、考勤系统等场景。