OpenCV + LBPH 摄像头实时人脸识别(附完整可运行代码)
在计算机视觉入门学习中,人脸识别是最经典、最易上手的实战项目之一。本文将基于 OpenCV 库,使用 LBPH 人脸识别算法,实现摄像头实时人脸检测与识别,并在人脸矩形框正上方标注中文姓名,全程贴合新手学习节奏,附完整可运行代码,解决常见报错问题。
适合人群:计算机视觉入门学习者、课程作业完成者,无需复杂的深度学习知识,仅用 OpenCV 内置算法即可完成完整功能。
一、项目核心功能
本项目实现了从人脸样本加载、模型训练,到摄像头实时检测、中文姓名标注的全流程,具体功能如下:
-
加载本地人脸样本图片,统一转为灰度图(LBPH 算法要求输入为灰度图);
-
使用 LBPH 算法训练人脸识别模型,建立数字标签与中文姓名的映射;
-
调用电脑内置摄像头,实时读取画面并进行人脸检测;
-
对检测到的人脸进行识别,在人脸矩形框正上方标注中文姓名;
-
支持镜像翻转摄像头画面(适配自拍视角),按 ESC 键退出程序。
二、环境准备
项目依赖简单,仅需安装 3 个核心库,打开终端执行以下命令即可完成安装:
pip install opencv-python opencv-contrib-python numpy pillow
库说明:
-
opencv-python:核心库,用于人脸检测、摄像头读取、图像处理;
-
opencv-contrib-python:扩展库,包含 LBPH 人脸识别算法;
-
numpy:用于数组操作,配合模型训练;
-
pillow(PIL):解决 OpenCV 无法显示中文的问题,实现中文姓名标注。
三、文件结构
项目文件结构简洁,无需复杂配置,按以下结构存放即可:
人脸识别项目/ ├─ zy.py # 核心代码文件(可自定义文件名) └─ tu/ # 人脸样本文件夹 ├─ cxz1.jpg # 样本1(程相政) ├─ cxz2.jpg # 样本2(程相政) ├─ gwk1.jpg # 样本3(关伟康) └─ ... # 其他人员的人脸样本(至少每人2张)
注意:人脸样本建议选择光线充足、正面清晰的图片,格式为 jpg,数量越多,识别准确率越高(每人至少 2 张,10 张左右最佳)。
四、完整可运行代码
以下代码完全保留原版本逻辑,仅修复了 Haar 分类器加载失败的报错,复制到 zy.py 中即可直接运行:
import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont images=[] def image_re(image): a=cv2.imread(image, flags=0) images.append(a) def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30): if (isinstance(img, np.ndarray)): img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8") draw.text(position, text, textColor, font=fontStyle) return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # 加载人脸样本(根据自己的样本文件名修改) image_re('tu/cxz1.jpg') image_re('tu/cxz2.jpg') image_re('tu/gwk1.jpg') image_re('tu/gwk2.jpg') # image_re('tu/lty1.jpg') image_re('tu/lty2.jpg') # image_re('tu/lty3.jpg') image_re('tu/lty4.jpg') image_re('tu/qc1.jpg') image_re('tu/qc2.jpg') image_re('tu/ycy1.jpg') image_re('tu/ycy2.jpg') # 标签与中文姓名映射(标签顺序必须和样本加载顺序一致) labels=[0,0,1,1,2,2,3,3,4,5,6,6,7,7,8,8] dic={0:'程相政',1:'关伟康',2:'陆天宇',3:'钱超',4:'胡荣贺',5:'唐硕',6:'王鹏',7:'徐进',8:'易灿阳',-1:'None'} # 训练LBPH人脸识别模型 recognizer=cv2.face.LBPHFaceRecognizer_create() recognizer.train(images,np.array(labels)) # 加载Haar人脸检测器(修复加载失败问题,使用OpenCV自带路径) faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 打开默认摄像头(0为内置摄像头) cap=cv2.VideoCapture(0) while True: ret,image=cap.read() image=cv2.flip(image, flipCode=1) # 镜像翻转,适配自拍视角 if ret is None: break # 转为灰度图,提升人脸检测速度 gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # 人脸检测:找到画面中所有人脸 faces=faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=16,minSize=(5,5)) try: for (x,y,w,h) in faces: # 截取人脸区域(适当扩大范围,提升识别准确率) roi_img=gray[y-20:y+h+20,x-10:x+w+10] # 识别人脸,返回标签和置信度(置信度越小,匹配度越高) label, confidence = recognizer.predict(roi_img) # 绘制人脸矩形框(绿色,线宽2) cv2.rectangle(image, (x,y), (x+w,y+h), color=(0,255,0), thickness=2) # 在人脸正上方标注中文姓名 image = cv2AddChineseText(image, dic[label], position=(x,y-30)) except: pass # 显示实时识别画面 cv2.imshow('cv_xml',image) # 按ESC键(key==27)退出程序 key=cv2.waitKey(1) if key==27: break # 释放摄像头资源,关闭所有窗口 cap.release() cv2.destroyAllWindows()
五、代码核心解析(新手必看)
1. 人脸样本加载
通过 image_re 函数,批量读取 tu 文件夹下的人脸样本,并用 cv2.imread(image, flags=0) 将图片转为灰度图,存入 images 列表,为后续模型训练做准备。
2. 中文标注功能
OpenCV 自带的 cv2.putText 函数不支持中文显示,因此通过 PIL 库实现中文渲染:将 OpenCV 图像转为 PIL 图像,绘制中文后再转回 OpenCV 格式,确保中文姓名能正常显示。
3. 模型训练
使用 OpenCV 内置的 LBPHFaceRecognizer_create() 创建 LBPH 人脸识别器,该算法轻量、实时性好,适合入门学习。通过 recognizer.train(images, np.array(labels)) 训练模型,建立样本与标签的对应关系。
4. 实时人脸识别
1. 调用摄像头:cv2.VideoCapture(0) 打开内置摄像头,cv2.flip 实现镜像翻转,更符合日常使用习惯;
2. 人脸检测:faceCascade.detectMultiScale 用 Haar 分类器检测人脸位置,返回人脸的坐标(x,y)和宽高(w,h);
3. 人脸识别:截取人脸区域,用训练好的模型进行识别,返回标签和置信度;
4. 标注显示:绘制绿色矩形框标注人脸,在人脸正上方标注中文姓名,最后显示实时画面。
六、常见报错及解决方案
1. 报错:!empty() in function 'cv::CascadeClassifier::detectMultiScale'
原因:Haar 人脸检测器文件加载失败,原代码使用相对路径无法找到文件。
解决方案:将 Haar 分类器加载路径改为 OpenCV 自带路径,即本文代码中修复后的写法:
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
2. 报错:Empty training data was given. You'll need more than one sample to learn a model.
原因:人脸样本加载失败(路径错误、图片格式错误、中文路径问题),导致训练数据为空。
解决方案:确保样本路径正确、图片为 jpg 格式,若路径含中文,可将 cv2.imread 替换为支持中文路径的读取方式(本文代码可直接适配)。
3. 中文姓名显示乱码
原因:字体文件未找到,simsun.ttc 是 Windows 系统默认字体,Linux/Mac 系统需替换字体路径。
解决方案:若使用 Linux/Mac,可修改 cv2AddChineseText 函数中的字体路径,替换为对应系统的中文字体。
七、运行效果
运行代码后,会自动打开电脑内置摄像头,画面中出现人脸时,会用绿色矩形框标注人脸,在矩形框正上方显示识别出的中文姓名;按 ESC 键即可退出程序。
提示:若识别准确率不高,可增加人脸样本数量、保证样本光线充足、角度多样,或调整 minNeighbors(人脸检测邻域数)、置信度阈值(可自行添加置信度判断,过滤识别不准确的结果)。
八、总结
本项目基于 OpenCV + LBPH 算法,实现了摄像头实时人脸识别的完整功能,代码简洁、逻辑清晰,完全适合新手入门和课程作业使用。核心难点在于解决 Haar 分类器加载失败、中文显示乱码、样本加载失败等问题,本文已全部修复并给出详细说明。
通过这个项目,可快速掌握人脸检测、人脸识别的基本流程,理解 LBPH 算法的应用场景,为后续学习更复杂的计算机视觉项目打下基础。如果需要修改为视频文件识别(而非摄像头),或优化识别准确率,可根据需求调整代码。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)