☰
Python与opencv实现自动人脸捕捉
2026/10/15 7:46:22 网站建设 项目流程

撰写不易,请您珍惜❤

```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 参数

· 保存的图片存储在程序运行目录下

这个程序适合用于人脸采集、考勤系统等场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询