python之opencv库Haar级联分类器检测人脸–‘haarcascade_frontalface_default.xml‘

python之opencv库Haar级联分类器检测人脸–‘haarcascade_frontalface_default.xml’

opencv库: 它由 Intel 公司发起并参与开发,其初衷是为了提供高效的计算机视觉算法实现。随着计算机视觉领域的发展,OpenCV不断更新和完善,吸引了全球众多开发者的贡献。如今,它已成为计算机视觉领域应用最为广泛的库之一。它提供了多种编程语言接口,主要包括 C++、Python、Java 等。

此案例中使用opencv库中Haar级联文件中与预训练好的检测正面人脸的模型文件’haarcascade_frontalface_default.xml’进行本地视频以及摄像头获取的人脸检测。

文件末尾有完整的代码

文件结构:

将三个文件放在同一级目录(同一个文件夹)下。

  • face.mp4是要检测的本地视频
  • Haar_face_test.py文件:python源码文件
  • haarcascade_frontalface_default.xml文件:Opencv库中预训练好的检测正面人脸的模型文件。在opencv文件(cv2)中的data文件中可以找到它。复制粘贴过来
  • cmd中下载opencv库:

    pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/
    

    分模块代码解读:
    1.首先导入opencv的库

    import cv2
    

    2.加载级联分类器

    face_cascade = cv2.CascadeClassifier(
        'haarcascade_frontalface_default.xml'
    )
    

    3.初始化视频捕捉对象

    # cap = cv2.VideoCapture('face.mp4')
    cap = cv2.VideoCapture(0)  #传入数字0,表示打开本机摄像头
    

    4.读取视频,对视频进行处理

    scaling_factor = 0.5  #(比例因子)缩放比
    
    while True:
        _, frame = cap.read()   #读取视频的下一帧
    

    cap.read()方法用于读取视频的下一帧,它返回两个值,第一个值表示是否成功读取到帧(这里用_忽略了这个返回值,通常可以用来做错误处理判断是否视频读取完毕等情况),第二个值就是读取到的视频帧图像数据。

     frame = cv2.resize(frame, None,
                        fx=scaling_factor, 
                        fy=scaling_factor,
                        interpolation=cv2.INTER_AREA)
    

    cv2.resize函数按照之前定义的缩放因子对读取到的帧进行缩放,通过指定fx(水平方向缩放因子)和fy(垂直方向缩放因子)都为scaling_factor来实现等比例缩放,interpolation = cv2.INTER_AREA指定了缩放时采用的插值算法(INTER_AREA适用于缩小图像尺寸的情况)。

     gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)   #彩色图像灰度化
    
      cv2.putText(frame, 'face', (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                    1, (0, 0, 255), 2)    #视频中显示'face'文字
    

    cv2.FONT_HERSHEY_SIMPLEX:指定文字使用的字体类型 1:表示字体的缩放比例 2:表示文字的线条粗细,单位:像素

     face_rects = face_cascade.detectMultiScale(gray, 1.3, 5)
    

    face_cascade.detectMultiScale方法是利用之前加载的人脸检测级联分类器模型在灰度图像gray上进行人脸检测,它的参数中1.3是scaleFactor(表示每次图像缩放的比例因子,用于在不同尺度下检测人脸,逐步缩小图像来检测不同大小的人脸),5是minNeighbors(表示构成检测目标的相邻矩形的最小个数,可用于减少误检测等情况),该方法返回检测到的人脸区域的矩形框信息(以包含左上角坐标(x, y)以及矩形的宽w和高h的元组形式, 多个矩形框信息以列表形式返回),存储在face_rects变量中。

      for (x, y, w, h) in face_rects:
            cv2.rectangle(frame, (x, y), (x + w, y + h ), (0, 255, 0), 2)
            # 然后通过一个循环遍历检测到的每个人脸矩形框信息
            #使用cv2.rectangle 函数在原始彩色帧frame上绘制绿色(颜色参数(0, 255, 0)表示绿色,在OpenCV中颜色以BGR顺序表示)的矩形框来标记人脸位置,
            # 矩形框的线宽设置为2像素。
            cv2.imshow('Output',frame)
            #显示处理后的视频
            c = cv2.waitKey(1)
            if c == 27:
                break
            # cv2.waitKey(1) 等待用户按键,参数 1表示等待1毫秒,它返回用户按下的键对应的ASCII码值
            # 这里将返回值赋给 c,如果用户按下Esc键(其ASCII码值为27),则通过 if 判断跳出循环,结束程序运行。
    
    cap.release()
    cv2.destroyAllwindows()
    #释放资源和关闭窗口
    

    完整代码:

    import cv2
    
    face_cascade = cv2.CascadeClassifier(
        'haarcascade_frontalface_default.xml'
    )
    
    cap = cv2.VideoCapture('face.mp4')
    #cap = cv2.VideoCapture(0)  #传入数字0,表示打开本机摄像头
    
    scaling_factor = 0.5
    
    while True:
        _, frame = cap.read()
        frame = cv2.resize(frame, None,
                           fx=scaling_factor, fy=scaling_factor,
                           interpolation=cv2.INTER_AREA)
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.putText(frame, 'face', (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                    1, (0, 0, 255), 2)
        face_rects = face_cascade.detectMultiScale(gray, 1.3, 5)
    
        for (x, y, w, h) in face_rects:
            cv2.rectangle(frame, (x, y), (x + w, y + h ), (0, 255, 0), 2)
            cv2.imshow('Output',frame)
            c = cv2.waitKey(1)
            if c == 27:
                break
    
    cap.release()
    cv2.destroyAllwindows()
    

    检测结果截图:

    作者:沙度灬

    物联沃分享整理
    物联沃-IOTWORD物联网 » python之opencv库Haar级联分类器检测人脸–‘haarcascade_frontalface_default.xml‘

    发表回复