zoukankan      html  css  js  c++  java
  • 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:为目标的最大尺寸

  • 相关阅读:
    操作系统设计与实现 读笔(2)
    操作系统设计与实现 读笔(1)
    C++历史及优点
    套接字Socket——TCP、UDP通信
    Unix环境_进程管理
    Unix环境_信号处理机制
    排序算法汇总
    TCP/IP体系结构
    数据库模式——三级模式两级映像
    杨辉三角形的递归实现
  • 原文地址:https://www.cnblogs.com/Guser/p/14876491.html
Copyright © 2011-2022 走看看