1. 人脸检测流程
人脸检测的过程是采用多尺度滑窗搜索模式,每个尺度通过一定的步长截取20x20的窗口,然后在分类器中对这些窗口进行判决,如果是人脸就通过所有分类器,否则会在某一级分类器中被排除。
人脸检测流程图2.LBP算法
LBP是指局部二值模式,它用来描述图像的局部特征,具有灰度不变性和旋转不变性的优点。
基本的LBP原理的通俗解释:LBP算子定义在像素3x3的邻域内,以邻域中心像素为阈值,相临的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素的位置被标记为1,否则为0。这样,在3x3的领域中就产生了一个8位的二进制数,这个二进制数就是中心点的LBP值。因此,LBP值共有2^8种可能。中心像素的LBP值反应了周围像素的纹理信息。
LBP计算示意图改进的LBP:基本的LBP算子只覆盖了一个固定半径范围的小区域,不能满足不同尺寸和频率纹理的需要。改进后的LBP算子,可以适应不同尺度的纹理特征,并达到灰度、旋转不变性的要求。改进后的LBP将3x3的区域扩展到任意区域,用圆形邻域代替正方形邻域,允许在半径为R的圆形邻域内有任意多个像素点。半径为R,采样点为P个的LBP算子表示为。
圆形LBPLBP是灰度不变的,但不是旋转不变。改进后的LBP实现了旋转不变性。
实现方式:不断旋转圆形邻域,得到一系列初始定义的LBP值,取最小值作为该邻域的值。
等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。比如:00000000 11111111 10111111。
除了等价模式,其余的都是混合模式。
会产生种模式,改进后LBP的模式数由降维到p*(p-1)+2。维数减少可以降低高频噪声的影响。
3.代码实现
OpenCV实现了LBP特征的计算,但没有提供单独的接口。
代码
#coding:utf-8
import cv2as cv
#读取原始图像
img = cv.imread('qwe.jpg')
#检测人脸
face_detect = cv.CascadeClassifier('lbpcascade_frontalface_improved.xml')
#灰度处理
gray = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)
#检查人脸 按照1.1倍放大 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor=2, minNeighbors=2)
print('识别人脸的信息:\n', face_zone)
#绘制矩形和圆形人脸检测
for x,y,w,hin face_zone:
#绘制矩形人脸区域
cv.rectangle(img, pt1=(x,y), pt2=(x+w, y+h), color=[0,0,255],thickness=2)
#绘制圆形人脸区域 radius表示半径
cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
#设置图片可以手动调节大小
cv.namedWindow('wo',0)
#显示图片
cv.imshow('wo', img)
#等待显示 设置任意键退出程序
cv.waitKey(0)
cv.destroyAllWindows()
结果:
网友评论