zoukankan      html  css  js  c++  java
  • OpenCV图像人脸检测及视频中的人脸检测(附源码)

    文章目录

    • 一、数据和知识准备

      • 1. 下载HAAR与LBP数据

      • 2. opencv相关知识

    • 二、python+opencv实现人脸检测

    •           1. 图像单人脸检测

                2. 图像多人脸检测

                3. 视频中人脸检测

                4. 摄像头人脸检测

      一、数据和知识准备

      1. 下载HAAR与LBP数据

      人脸检测的常见步骤如下,如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,这里我们使用网上公开的扩展包或已经训练好的分类器。

      将haarcascades与lbpcascades里面的相关xml文件下载到本地,便于之后调用,辅助进行人脸检测。

      下载地址:https://github.com/opencv/opencv/tree/master/data


      2. opencv相关知识

      cv.CascadeClassifier():是OpenCV中人脸检测的一个级联分类器,既可以使用Haar特征,也可以使用LBP特征。以Haar特征分类器为基础的对象检测技术是一种非常有效的技术,它是基于机器学习且使用大量的正负样本训练得到分类器。

      detectMultiScale函数:检测人脸算法,其参数如下:
      image:要检测的输入图像
      scaleFactor:表示每次图像尺寸减小的比例
      minNeighbors:表示每一个目标至少要被检测到多少次才算是真的人脸,因为周围的像素和不同的窗口大小都可能检测成人脸
      minSize:表示目标的最小尺寸
      maxSize:表示目标的最小尺寸

      Haar-like矩形特征:是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。

      LBP:是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。LBPH是在原始LBP上的一个改进,在opencv支持下可以直接调用函数直接创建一个LBPH人脸识别的模型。
      比如:cv2.face.LBPHFaceRecognizer_create()。

    • 二、python+opencv实现人脸检测

      1. 图像单人脸检测

      import cv2 as cv
      
      
      
      
      def face_detection(image):
          # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
          face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
          # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
          faces = face_detecter.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5)
          print('检测人脸信息如下:
      ', faces)
          for x, y, w, h in faces:
              # 在原图像上绘制矩形标识
              cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
          cv.imshow('result', image)
      
      
      
      
      src = cv.imread(r'./test/036.jpg')
      cv.imshow('input image', src)
      face_detection(src)
      cv.waitKey(0)
      cv.destroyAllWindows()
      

    运行效果如下:

    检测人脸信息如下:
     [[ 61  53 110 110]]
    
    
    Process finished with exit code 0
    
    
    

    2. 图像多人脸检测

    import cv2 as cv
    
    
    
    
    def face_detection(image):
      # 转成灰度图像
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
        face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
        # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
        faces = face_detecter.detectMultiScale(image=gray, scaleFactor=1.1, minNeighbors=5)
        print('检测人脸信息如下:
    ', faces)
        for x, y, w, h in faces:
            # 在原图像上绘制矩形标识
            cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
        cv.imshow('result', image)
    
    
    
    
    src = cv.imread(r'./test/044.jpg')
    cv.imshow('input image', src)
    face_detection(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    
    

    运行效果如下:

    检测人脸信息如下:
     [[329 157  49  49]
     [ 88 156  44  44]
     [157 158  54  54]
     [240 159  50  50]
     [ 86 370  68  68]
     [ 79 254  54  54]
     [339 250  58  58]
     [155 254  59  59]
     [251 247  59  59]
     [199 371  80  80]
     [308 370  69  69]]
    
    
    Process finished with exit code 0
    
    
    


    3. 视频中人脸检测

    import cv2
    
    
    
    
    # 加载视频
    cap = cv2.VideoCapture('test.mp4')
    # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
    face_detect = cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
    
    
    while True:
        # 读取视频片段
        ret, frame = cap.read()
        if not ret:  # 读完视频后falg返回False
            break
        frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
        # 灰度处理
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
        face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=8)
        # 绘制矩形和圆形检测人脸
        for x, y, w, h in face_zone:
            cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
            cv2.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
        # 显示图片
        cv2.imshow('video', frame)
        # 设置退出键和展示频率
        if ord('q') == cv2.waitKey(40):
            break
    
    
    # 释放资源
    cv2.destroyAllWindows()
    cap.release()
    
    
    

    截取新版倚天屠龙记某一集36:35到36:39的片段,简单实现实时检测人脸并显示,运行效果如下:


    任何算法都不会100%识别准确,由于噪声、误差、算法、训练集等影响,某些时候也会出现一些错误识别。自己进行简单测试时也会发现,人物动作、视频中镜头切换过快、背景变化等因素,可能会造成对视频中人脸检测不准确。

    4. 摄像头人脸检测

    import cv2 as cv
    
    
    
    
    # 识别电脑摄像头并打开
    cap = cv.VideoCapture(0, cv.CAP_DSHOW)
    # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
    face_detect = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
    
    
    while True:
        # 读取视频片段
        flag, frame = cap.read()
        frame = cv.flip(frame, 1)
        if not flag:   # 读完视频后falg返回False
            break
        # 灰度处理
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
        face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
        # 绘制矩形和圆形检测人脸
        for x, y, w, h in face_zone:
            cv.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
            cv.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
        # 显示图片
        cv.imshow('video', frame)
        # 设置退出键q 展示频率
        if ord('q') == cv.waitKey(30):
            break
    
    
    # 释放资源
    cv.destroyAllWindows()
    cap.release()
    
    
    

    程序运行,即可调用电脑的摄像头识别面对摄像头的人脸,正脸和静止状态检测人脸的效果好。

    - END -

    欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章

    记录学习python的点点滴滴;

    回复【开源源码】免费获取更多开源项目源码;

    耐得住寂寞,才能登得顶
    Gitee码云:https://gitee.com/lyc96/projects
  • 相关阅读:
    Python进程池
    Python进程间通信
    python编程中的if __name__ == 'main与windows中使用多进程
    Python进程-实现
    python进程join()函数理解
    python 进程池Pool
    python多进程打印字符,加锁(Lock加锁)
    python进程、多进程
    正则表达式统计字符串中数字的个数
    python 处理xml
  • 原文地址:https://www.cnblogs.com/chenlove/p/14038537.html
Copyright © 2011-2022 走看看