基于OpenCV LBPH算法的实时人脸识别系统 - Python实现

5 阅读5分钟

项目简介

本项目是一个基于Python和OpenCV的实时人脸识别系统,采用轻量级的LBPH(Local Binary Patterns Histograms)算法,支持用户录入、人脸识别、性别年龄估算等功能。系统采用SQLite数据库存储人脸特征,具有良好的可扩展性和实用性。

项目地址: gitee.com/mobuhan/per…

技术栈

  • Python 3.13
  • OpenCV 4.13.0 - 图像处理和人脸识别
  • Tkinter - GUI界面
  • Pillow (PIL) - 中文文本绘制
  • SQLite - 轻量级数据库
  • opencv-contrib-python - 包含face模块

核心功能

1. 实时人脸识别

  • 使用Haar Cascade检测人脸
  • LBPH算法进行人脸识别
  • 实时显示识别结果和相似度

2. 用户录入系统

  • 自动检测新用户
  • 弹窗录入用户姓名
  • 支持多人脸特征存储(多角度强化)

3. 性别年龄识别

  • 基于图像特征的性别估算
  • 基于图像特征的年龄估算
  • 实时显示在识别框中

4. 防重复录入

  • 已识别用户不再提示录入
  • 10秒冷却时间避免重复弹窗
  • 并发控制机制

项目结构

checkMan/
├── main_complete.py          # 主程序(完整版)
├── face_recognizer.py        # 人脸识别核心模块
├── face_db.py                # 数据库管理模块
├── reset_db.py               # 数据库重置工具
├── check_database.py         # 数据库检查工具
├── test_camera.py            # 摄像头测试工具
└── faces.db                  # SQLite数据库文件

快速开始

环境要求

Python >= 3.8
pip install opencv-python opencv-contrib-python Pillow numpy

安装步骤

  1. 克隆项目:
git clone https://gitee.com/mobuhan/personnel-identification.git
cd personnel-identification
  1. 安装依赖:
pip install opencv-python opencv-contrib-python Pillow numpy
  1. 运行程序:
python main_complete.py

使用说明

  1. 启动程序:运行 main_complete.py
  2. 启动摄像头:点击"▶ 启动摄像头"按钮
  3. 录入用户:检测到新用户时会自动弹出录入窗口,输入姓名即可
  4. 识别用户:已录入用户会显示姓名、性别、年龄和相似度
  5. 停止识别:点击"■ 停止摄像头"按钮
  6. 退出程序:点击右上角关闭按钮

核心算法

LBPH人脸识别算法

LBPH(Local Binary Patterns Histograms)是一种高效的纹理描述符,用于人脸识别具有以下优势:

  • 计算效率高:适合实时应用
  • 对光照变化鲁棒:通过局部二值模式减少光照影响
  • 训练简单:不需要大量样本即可训练
  • 轻量级:无需GPU,CPU即可流畅运行

算法流程:

  1. 将人脸图像转换为灰度图
  2. 直方图均衡化增强对比度
  3. 计算局部二值模式(LBP)
  4. 构建LBP直方图
  5. 使用欧氏距离或卡方距离进行匹配

置信度阈值

# LBPH算法:置信度越低表示越相似
threshold = 100  # 阈值设置

if confidence < threshold and label in self.label_map:
    return self.label_map[label], confidence
else:
    return "???", confidence

相似度计算公式:

similarity = max(0, 100 - confidence)

关键技术点

1. 多线程视频处理

使用独立的线程处理视频流,避免阻塞GUI主线程:

def start_camera(self):
    self.running = True
    thread = threading.Thread(target=self.video_loop, daemon=True)
    thread.start()

2. 中文文本绘制

OpenCV的cv2.putText不支持中文,使用Pillow库解决:

def draw_chinese_text(self, img, text, position, font_size=24, color=(255, 255, 255)):
    # 加载微软雅黑字体
    font = ImageFont.truetype("C:/Windows/Fonts/msyh.ttc", font_size)
    pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(pil_img)
    draw.text(position, text, font=font, fill=color)
    return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)

3. 数据库设计

使用SQLite存储用户信息和人脸特征:

-- 用户表
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 人脸特征表
CREATE TABLE face_features (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    encoding BLOB NOT NULL,
    angle TEXT DEFAULT 'unknown',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

4. 模型训练与更新

支持动态添加新用户并重新训练模型:

def retrain_model(self):
    features = self.db.get_all_face_features()
    images = []
    labels = []
    
    for feature in features:
        # 解码图像数据
        img_array = np.frombuffer(feature['encoding'], np.uint8)
        img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img = cv2.resize(img, (200, 200))
        images.append(img)
        labels.append(feature['user_id'])
    
    # 训练模型
    self.recognizer.train(images, np.array(labels))

性能优化

1. 图像预处理优化

# 缩小图像以加快处理速度
small_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)
gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)

# 直方图均衡化
face_equalized = cv2.equalizeHist(face_resized)

2. 人脸识别参数调优

faces = self.face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,        # 图像缩放比例
    minNeighbors=5,         # 每个候选矩形至少保留的邻居数
    minSize=(30, 30)        # 最小人脸尺寸
)

3. 帧率控制

# 控制帧率在30fps左右
time.sleep(0.03)

常见问题

Q1: 模型未训练错误

问题: This LBPH model is not computed yet. Did you call the train method?

解决: 确保至少录入一个用户后重启摄像头,系统会自动训练模型。

Q2: 中文显示乱码

问题: 识别框中的中文姓名显示为乱码

解决: 使用Pillow库绘制中文文本,并确保系统安装了中文字体(如微软雅黑)。

Q3: 摄像头无法打开

问题: 点击启动摄像头按钮无反应

解决:

  1. 检查摄像头是否被其他程序占用
  2. 使用test_camera.py测试摄像头
  3. Windows系统使用cv2.CAP_DSHOW后端

Q4: 识别率低

问题: 总是识别为"???"

解决:

  1. 确保光线充足
  2. 正面面对摄像头
  3. 增加训练样本(同一用户多角度录入)
  4. 调整阈值参数

扩展方向

  1. 深度学习集成:集成FaceNet、ArcFace等深度学习模型提高识别精度
  2. 活体检测:添加活体检测功能防止照片攻击
  3. 多人识别:优化算法支持多人同时识别
  4. Web界面:开发Web版本支持远程访问
  5. 移动端适配:移植到Android/iOS平台
  6. 云端存储:支持人脸特征云端同步

项目截图

人脸识别界面转存失败,建议直接上传图片文件

系统主界面,显示实时识别结果

贡献指南

欢迎提交Issue和Pull Request!

许可证

本项目采用MIT许可证。

联系方式


如果你觉得这个项目对你有帮助,欢迎Star和Fork!