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:为目标的最小尺寸

  • maxSize:为目标的最大尺寸

posted @ 2021-06-11 20:56  Guser  阅读(693)  评论(0编辑  收藏  举报