前言
要实现人脸识别首先要判定当前图像中是否出现了人脸,这就是人脸检测。只有检测到图像中出现了人脸,才能据此判定这个人到底是谁。
一、OpenCV怎样实现人脸检测
调用 OpenCV 中练习好的分类器实现人脸检测。OpenCV 提供了练习好的haar级联分类器,OpenCV 还提供了利用 HOG 特征(重要用于行人检测)和 LBP 算法的级联分类器。
1、haar特征
什么是哈尔特征?
哈尔特征(Haar-like features)是一种基于图像亮度差异的特征形貌符,通常用于形貌图像的局部特征。这些特征通常是矩形区域的亮度差异,例如眼睛周围的玄色和白色区域。哈尔特征可以捕捉到目的的边沿、线条和纹理等信息,从而可以用来区分目的和背景。
特征值 = ∑特征区域中白色区域的像素值-玄色区域像素值
Haar特征反映的是图像的灰度变化
关于 Harr 特征中的矩形框,有如下 3 个变量:
• 矩形框位置: 矩形框要逐像素点地划过(遍历) 整个图像获取每个位置的特征值。
• 矩形框大小: 矩形的大小可以根据必要举行恣意调解。
• 矩形框类型: 包含垂直、水平、对角等差异类型。
2、级联分类器
分类器必要对图像的多个特征举行识别。例如,在识别一个动物是狗(正类)还是其他动物(负类)时,直接根据多个条件举行判定,流程是非常烦琐的。假如先判定该动物有几条腿。有四条腿的动物被判定为可能为狗,并对此范围内的对象继续举行分析和判定。没有四条腿的动物直接被否决,即不可能是狗。只通过比较腿的数量就能排除样本会合大量的负类(如鸡、鸭、鹅等不是狗的动物的实例)。级联分类器就是基于这种思路将多个简单的分类器按照一定的顺序级联而成的。
3、级联分类器的利用
OpenCV 提供了opencv_createsamples.exe 和opencv_traincascade.exe 文件,这两个 exe 文件必要去手动下载来说利用,他们可以用来练习级联分类器,练习级联分类器很耗时,假如练习的数据量较大,可能必要几天才能完成。
OpenCV 提供了一些练习好的级联分类器供用户利用。这些分类器可以用来检测人脸、脸部特征(眼睛、鼻子)、人类和其他物体。这些级联分类器以XML 文件的形式存放在 OpenCV 源文件的 data 目录下,因为在我们pip安装时已经下载好了,加载差异级联分类器的 XML 文件就可以实现对差异对象的检测。
二、人脸检测、微笑检测 案例实现
1、预处理
- import cv2
- image = cv2.imread('OIP-C.jpg')
- gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
复制代码 2、加载分类器
- '''--------------------加载分类器---------------------'''
- faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
- #分类器检测实现人脸识别
- faces = faceCascade.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=2,minSize=(8,8))
- print('发现张{}人脸'.format(len(faces)))
- print('位置',faces)
复制代码 3、标注人脸
- '''--------------------标注人脸及显示---------------------------'''
- 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()
复制代码 4、运行结果:
4、微笑检测
同样必要将OpenCV根目录下的一个用来举行微笑检测的xml文件级联分类器复制到代码文件同目录下,首先检测人脸,然后再判定是否是微笑的脸
完整代码:
- import cv2
- faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
- smile = cv2.CascadeClassifier('haarcascade_smile.xml')
- cap = cv2.VideoCapture(0)
- while True:
- ret,image = cap.read()
- image = cv2.flip(image,1)#镜像
- if ret is None:
- break
- gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
- faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=15,minSize=(5,5))
- #----------------------处理每个人脸--------------------------
- for (x,y,w,h) in faces:
- cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
- roi_gray_face = gray[y:y+h,x:x+w]
- cv2.imshow('face',roi_gray_face)
- smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=2,minSize=(50,50))
- for (sx,sy,sw,sh) in smiles:
- a = x + sx
- b = y + sy
- cv2.rectangle(image,(a,b),(a+sw,b+sh),(0,0,255),2)
- cv2.putText(image,'^=^',(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),thickness=2)
- cv2.imshow('dect',image)
- if cv2.waitKey(10) == 27:
- break
复制代码 运行结果自行检测。
总结
尽管传统Haar级联在复杂场景下存在局限,但其高效性仍使其成为许多实时系统的首选。对于更高精度的需求,可以联合深度学习模型(如MTCNN、RetinaFace)进一步提升效果。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|