实验目的
- 选取LBP、HOG两种特征提取算法做分类,去识别人的图像。
实验前明确的概念
- LBP、HOG是两种特征提取算法。
一、LBP分类
1、数据准备
- 如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,LBP这里我们使用网上公开的扩展包或已经训练好的分类器(后面的HOG我就没找到合适的分类器…)。
- 将lbpcascades里面的相关xml文件下载到本地,便于之后调用,辅助进行人脸检测。
LBP分类器下载地址:
https://github.com/opencv/opencv/tree/master/data
2、说明一些概念
-
cv.CascadeClassifier():
- 是OpenCV中人脸检测的一个级联分类器,既可以使用Haar特征,也可以使用LBP特征。
- 以Haar特征分类器为基础的对象检测技术是一种非常有效的技术,它是基于机器学习且使用大量的正负样本训练得到分类器。
-
detectMultiScale函数:检测人脸算法,其参数如下:
- image:要检测的输入图像
- scaleFactor:表示每次图像尺寸减小的比例
- minNeighbors:表示每一个目标至少要被检测到多少次才算是真的人脸,因为周围的像素和不同的窗口大小都可能检测成人脸
- minSize:表示目标的最小尺寸
- maxSize:表示目标的最小尺寸
-
LBP:
- 是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。
- 这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。
-
本代码中不涉及具体的LBP算法的实现,而是直接调用了现成的LBP分类器,直接实现了效果。
3、效果
可以看到,近处的人脸识别效果还可以,但是由于摄像头清晰度等原因,远处的人脸识别并不是很准确。
但是,抗遮挡效果貌似还可以:
动态效果如下:
4、实现代码
import cv2
##################################################
############使用LBP识别人脸#######################
##################################################
def use_LBP_to_distinguish_face():
# 识别打开摄像头
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# 创建LBP特征的分类器
face_detect = cv2.CascadeClassifier(r'tool/lbpcascades/lbpcascade_frontalface_improved.xml')
while True:
# 读取视频的每一帧
flag, frame = cap.read()
frame = cv2.flip(frame, 1)
if not flag:
break
# 进行灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5