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

  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/Guser/p/14876491.html
Copyright © 2011-2022 走看看