python基于opencv库的人脸识别总结
1人脸检测
2图像获取
3模型训练(包含人脸特征值)
4读取模型进行人脸识别
二、人脸检测
参考链接(https://www.cnblogs.com/zyly/p/9410563.html
2-1、人脸检测必备基础知识
2-1-1基本原理:(1)知识类:主要把人脸看作器官组合,根据器官的相对几何位置关系来识别人脸和取特征值(2)统计方法(算法)将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。主要包括主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、Adaboost算法等。 //学长的my_UI的人脸识别基于支持向量机算法我自己找的基于Adaboost算法
2-1-2哈尔特征值精简理解版: 边缘、线性、中心、对角线的特征值组成特征模板(特征模板的特征值为白色像素和减去黑色像素和)//当定位到人脸的识别点之后根据特征模板取特征值
//2-1-3级联分类器:从上面所述内容我们可以总结Haar分类器训练的五大步骤:1、准备人脸、非人脸样本集;2、计算特征值和积分图;3、筛选出T个优秀的特征值(即最优弱分类器);4、把这个T个最优弱分类器传给AdaBoost进行训练。5、级联,也就是强分类器的强强联手。
2-1-3xml文件opencv自带了训练器和检测器也可以自己训练分类器来识别其他的haarcascades、lbpcascades 分别是基于不同的特征取特征值
2-2视频中的人脸检测
#2、视频中的人脸检测
def DynamicDetect():
'''
打开摄像头,读取帧,检测帧中的人脸,扫描检测到的人脸中的眼睛,对人脸绘制蓝色的矩形框,对人眼绘制绿色的矩形框
'''
#创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
#导入python的opencv自带的训练器,若出bug可以改为绝对路径
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
#打开摄像头
camera = cv2.VideoCapture(0)
#0表示摄像头的id,当调取网络摄像头时id要换为url
cv2.namedWindow('Dynamic')#给视频窗体取名字
while(True):
#读取一帧图像
ret,frame = camera.read()
#判断图片读取成功?
if ret:
gray_img = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转为灰度图像
#人脸检测
faces = face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#在原图像上绘制矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray_img[y:y+h,x:x+w]
#眼睛检测
eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(frame,(ex+x,ey+y),(x+ex+ew,y+ey+eh),(0,255,0),2)
cv2.imshow('Dynamic',frame)
#如果按下q键则退出
if cv2.waitKey(100) & 0xff == ord('q') :
break
camera.release()
cv2.destroyAllWindows()
对detectMultiScale函数的解析
detectMultiScale(image[,scaleFactor[,minNeighbors[,flags[,minSize[,maxSize]]]]])
-
image:表示的是要检测的输入图像
-
scaleFactor:为每一个图像尺度中的尺度参数,默认值为1.1。scaleFactor参数可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体。
-
minNeighbors:参数为每一个级联矩形应该保留的邻近个数,默认为3。minNeighbors控制着误检测,默认值为3表明至少有3次重叠检测,我们才认为人脸确实存。
-
flags:对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING,这个值告诉分类器跳过平滑(无边缘区域)。利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域;CV_HAAR_SCALE_IMAGE,这个值告诉分类器不要缩放分类器。而是缩放图像(处理好内存和缓存的使用问题,这可以提高性能。)就是按比例正常检测;CV_HAAR_FIND_BIGGEST_OBJECTS,告诉分类器只返回最大的目标(这样返回的物体个数只可能是0或1)只检测最大的物,CV_HAAR_DO_ROUGH_SEARCH,他只可与CV_HAAR_FIND_BIGGEST_OBJECTS一起使用,这个标志告诉分类器在任何窗口,只要第一个候选者被发现则结束寻找(当然需要足够的相邻的区域来说明真正找到了。),只做初略检测.
-
minSize:为目标的最小尺寸
-