撰写不易,请您珍惜❤

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

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

 

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

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐