文章目录
- 前言
- 一、OpenCV人脸识别基础
- 1.1 技术原理
- 1.2 应用场景对比
- 1.3 人脸识别算法对比:LBPH 、 EigenFace 、 FisherFace
- 二、人脸检测代码实现
- 2.1 代码
- 2.2 输出结果:
- 三、人脸识别代码实现
- 2.1 LBPH代码
- 2.2 EigenFace代码
- 2.3 FisherFace代码
- 2.4 输出结果
- 四、性能优化技巧
- 五、总结
前言
在计算机视觉领域,人脸识别技术一直是最受关注的应用之一。从手机解锁到机场安检,从社交平台自动标记到智能安防系统,这项技术正在深刻改变我们的生活。作为开源计算机视觉库的标杆,OpenCV为人脸识别提供了强大的工具支持。本文将带您深入浅出地了解OpenCV人脸识别的实现原理,并通过完整代码示例演示实际应用。
一、OpenCV人脸识别基础
1.1 技术原理
OpenCV主要采用Haar级联分类器和深度学习模型两种主流方法:
- Haar特征检测:通过分析图像中的矩形区域对比度特征,使用AdaBoost算法训练级联分类器
- LBPH算法(Local Binary Patterns Histograms):基于局部纹理特征进行识别
- 深度学习模型:OpenCV内置基于ResNet的FaceNet模型,支持高精度识别
1.2 应用场景对比
1.3 人脸识别算法对比:LBPH 、 EigenFace 、 FisherFace
二、人脸检测代码实现
2.1 代码
import cv2
image = cv2.imread('OIP-C.jpg')gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
'''--------------------加载分类器---------------------'''
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
#分类器检测实现人脸识别
faces = faceCascade.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=2,minSize=(8,8))
print('发现张{}人脸'.format(len(faces)))
print('位置',faces)
'''--------------------标注人脸及显示---------------------------'''
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('result',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 输出结果:
三、人脸识别代码实现
2.1 LBPH代码
import cv2
import numpy as np
images = []
images.append(cv2.imread('lyf1.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('lyf2.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zly1.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zly2.png',cv2.IMREAD_GRAYSCALE))
labels = [0,0,1,1]
dic = {0:'lyf',1:'zly',-1:'无法识别'}
predict_image = cv2.imread('lyf.png',cv2.IMREAD_GRAYSCALE)recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)recognizer.train(images,np.array(labels))label,confidence = recognizer.predict(predict_image)
print('这个人是:',dic[label])
print('置信度:',confidence)
2.2 EigenFace代码
import cv2
import numpy as np
images = []
c = cv2.imread('lyf1.png',0)
d = cv2.imread('lyf2.png',0)
a = cv2.imread('zly1.png',0)
b = cv2.imread('zly2.png',0)
a = cv2.resize(a,(120,180))
b = cv2.resize(b,(120,180))
c = cv2.resize(c,(120,180))
d = cv2.resize(d,(120,180))
images.append(a)
images.append(b)
images.append(c)
images.append(d)labels = [0, 0, 1, 1]
pre_image = cv2.imread('lyf.png', 0)
pre_image = cv2.resize(pre_image,(120, 180))recognizer = cv2.face.EigenFaceRecognizer_create(threshold = 20000)
recognizer.train(images, np.array(labels))
label, confidence = recognizer.predict(pre_image)
dic = {0:'lyf',1:'zly',-1:'no'}
print('这人是:',dic[label])
print('置信度为',confidence)aa = cv2.putText(cv2.imread('lyf.png').copy(),dic[label],(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,0,255),2)
cv2.imshow('xx',aa)
cv2.waitKey(0)
2.3 FisherFace代码
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):""" 向图片中添加中文 """if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))#实现array到image的转换draw = ImageDraw.Draw(img)# 在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)# 转换回OpenCV格式
def image_re(image):a = cv2.imread(image,0)a = cv2.resize(a,(120,180))images.append(a)
images = []
image_re('lyf.png')
image_re('lyf1.png')
image_re('lyf2.png')
image_re('lyf4.jpg')
image_re('zly1.png')
image_re('zly2.png')labels=[0,0,0,0,1,1]
pre_image = cv2.imread('lyf3.jpg',0)
pre_image = cv2.resize(pre_image,(120,180))recognizer = cv2.face.FisherFaceRecognizer_create(threshold=5000)
recognizer.train(images,np.array(labels))
label,confidence = recognizer.predict(pre_image)
dic = {0:'刘亦菲',1:'赵丽颖',-1:'无法识别'}
print('这人是:',dic[label])
print('置信度为',confidence)
image = cv2AddChineseText(cv2.imread('lyf3.jpg').copy(),dic[label],(30,10),textColor=(255,0,0))
cv2.imshow('xx',image)
cv2.waitKey(0)
2.4 输出结果
四、性能优化技巧
- 多尺度检测优化:通过金字塔缩放处理不同距离的人脸
- ROI区域处理:在视频流中仅处理运动区域
- 异步处理:使用多线程分离图像采集和处理逻辑
- 硬件加速:启用OpenCV的OpenCL支持
五、总结
通过OpenCV实现人脸识别既充满挑战又富有乐趣。随着OpenCV 4.x版本的持续更新,对深度学习模型的整合更加完善,开发者可以轻松构建从简单到复杂的人脸识别系统。
资源推荐:
OpenCV官方文档:https://docs.opencv.org
300-W人脸数据集:https://ibug.doc.ic.ac.uk/resources/300-W/
通过不断实践和优化,人脸识别技术的边界,正在被勇于创新的开发者们不断拓展。