Python与opencv实现自动人脸捕捉
撰写不易,请您珍惜❤
```python
import cv2
import os
from datetime import datetime
class FaceCapture:
def __init__(self, save_dir="captured_faces"):
"""
初始化人脸捕捉器
:param save_dir: 保存图片的文件夹
"""
self.save_dir = save_dir
if 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 = 0
self.face_count = 0
def detect_faces(self, frame):
"""
检测帧中的人脸
:param frame: 输入图像
:return: 检测到的人脸列表和绘制了矩形的图像
"""
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = self.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), (0, 255, 0), 2)
# 添加文字标签
cv2.putText(frame, "Face", (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
return faces, frame
def save_face(self, frame, faces):
"""
保存检测到的人脸
:param frame: 原始图像
:param faces: 人脸位置列表
"""
for i, (x, y, w, h) in enumerate(faces):
# 提取人脸区域
face_roi = frame[y:y+h, x:x+w]
# 生成文件名(包含时间戳)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"face_{timestamp}_{i+1}.jpg"
filepath = os.path.join(self.save_dir, filename)
# 保存图片
cv2.imwrite(filepath, face_roi)
self.face_count += 1
print(f"已保存人脸: {filename}")
def run(self, auto_save=True, save_interval=30):
"""
运行人脸捕捉主循环
:param auto_save: 是否自动保存
:param save_interval: 自动保存间隔(帧数)
"""
print("按 'q' 键退出")
print("按 's' 键手动保存当前检测到的人脸")
print("按 'r' 键重置计数器")
while True:
ret, frame = self.cap.read()
if not ret:
print("无法获取摄像头画面")
break
self.frame_count += 1
# 检测人脸
faces, display_frame = self.detect_faces(frame.copy())
# 显示检测到的人脸数量
cv2.putText(display_frame, f"Faces: {len(faces)}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(display_frame, f"Saved: {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) & 0xFF
if key == ord('q'):
break
elif key == ord('s') and len(faces) > 0:
self.save_face(frame, faces)
elif key == ord('r'):
self.face_count = 0
print("计数器已重置")
self.cleanup()
def cleanup(self):
"""清理资源"""
self.cap.release()
cv2.destroyAllWindows()
print(f"程序结束,共保存了 {self.face_count} 张人脸图片")
# 使用示例
if __name__ == "__main__":
try:
# 创建捕捉器实例
capturer = FaceCapture(save_dir="my_faces")
# 运行捕捉
# auto_save: 自动保存, save_interval: 每30帧保存一次
capturer.run(auto_save=True, save_interval=30)
except Exception as e:
print(f"发生错误: {e}")
```
使用说明
1. 安装依赖
```bash
pip install opencv-python
```
2. 运行程序
```bash
python face_capture.py
```
3. 控制键
· q: 退出程序
· s: 手动保存当前检测到的人脸
· r: 重置保存计数器
4. 高级版本(带更多人脸检测选项)
```python
import cv2
import numpy as np
from datetime import datetime
class 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 = 0
def 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), (x+w, y+h), (0, 255, 0), 2)
for (x, y, w, h) in eyes:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 1)
return all_faces, frame, eyes
def run(self):
while True:
ret, frame = self.cap.read()
if not ret:
break
faces, display_frame, eyes = self.detect_faces_advanced(frame)
# 显示统计信息
cv2.putText(display_frame, f"Faces: {len(faces)}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(display_frame, f"Eyes: {len(eyes)}", (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(display_frame, f"Saved: {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) & 0xFF
if key == ord('q'):
break
elif key == ord('s') and len(faces) > 0:
# 保存第一个检测到的人脸
x, y, w, h = faces[0]
face_img = frame[y:y+h, x:x+w]
filename = f"face_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
cv2.imwrite(filename, face_img)
self.saved_count += 1
print(f"已保存: {filename}")
self.cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
capturer = AdvancedFaceCapture()
capturer.run()
```
功能
1. 实时人脸检测:使用Haar级联分类器
2. 自动保存:可设置保存间隔
3. 手动控制:支持手动保存和重置
4. 多种检测:支持正面脸和侧脸检测
5. 眼睛检测:验证人脸检测准确性
6. 保存统计:显示已保存的人脸数量
注意事项
· 确保摄像头正常工作
· 光线充足时检测效果更好
· 可以根据需要调整 scaleFactor 和 minNeighbors 参数
· 保存的图片存储在程序运行目录下
这个程序适合用于人脸采集、考勤系统等场景。
更多推荐


所有评论(0)