项目简介
本项目是一个基于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
安装步骤
- 克隆项目:
git clone https://gitee.com/mobuhan/personnel-identification.git
cd personnel-identification
- 安装依赖:
pip install opencv-python opencv-contrib-python Pillow numpy
- 运行程序:
python main_complete.py
使用说明
- 启动程序:运行
main_complete.py - 启动摄像头:点击"▶ 启动摄像头"按钮
- 录入用户:检测到新用户时会自动弹出录入窗口,输入姓名即可
- 识别用户:已录入用户会显示姓名、性别、年龄和相似度
- 停止识别:点击"■ 停止摄像头"按钮
- 退出程序:点击右上角关闭按钮
核心算法
LBPH人脸识别算法
LBPH(Local Binary Patterns Histograms)是一种高效的纹理描述符,用于人脸识别具有以下优势:
- 计算效率高:适合实时应用
- 对光照变化鲁棒:通过局部二值模式减少光照影响
- 训练简单:不需要大量样本即可训练
- 轻量级:无需GPU,CPU即可流畅运行
算法流程:
- 将人脸图像转换为灰度图
- 直方图均衡化增强对比度
- 计算局部二值模式(LBP)
- 构建LBP直方图
- 使用欧氏距离或卡方距离进行匹配
置信度阈值
# 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: 摄像头无法打开
问题: 点击启动摄像头按钮无反应
解决:
- 检查摄像头是否被其他程序占用
- 使用
test_camera.py测试摄像头 - Windows系统使用
cv2.CAP_DSHOW后端
Q4: 识别率低
问题: 总是识别为"???"
解决:
- 确保光线充足
- 正面面对摄像头
- 增加训练样本(同一用户多角度录入)
- 调整阈值参数
扩展方向
- 深度学习集成:集成FaceNet、ArcFace等深度学习模型提高识别精度
- 活体检测:添加活体检测功能防止照片攻击
- 多人识别:优化算法支持多人同时识别
- Web界面:开发Web版本支持远程访问
- 移动端适配:移植到Android/iOS平台
- 云端存储:支持人脸特征云端同步
项目截图

系统主界面,显示实时识别结果
贡献指南
欢迎提交Issue和Pull Request!
许可证
本项目采用MIT许可证。
联系方式
- Gitee: gitee.com/mobuhan/per…
- 邮箱: mobuhan@example.com
如果你觉得这个项目对你有帮助,欢迎Star和Fork!