zoukankan      html  css  js  c++  java
  • 教你Python环境下如何用OpenCV检测人脸!

    一、文章概述

    本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:

    1、检测图片中的人脸
    2、实时检测视频中出现的人脸
    3、用运设备的摄像头实时检测人脸

    二:准备工作

    提前做的准备:

    • 安装好Python3
    • 下载安装OpenCV库,方法是pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple
    • 下载特征数据HAAR和LBP,这两种数据都能实现对人脸特征的提取,HAAR大多是小数计算所以运算速度较慢,LBP大多是整数计算运行速度较快。如图所示,本次实例用红框中的文本,其他的文本,比如第一个haarcascade_eye.xml是眼睛识别的文本,我们下次再用。
      注意:点击下载HAAR和LBP的特征数据--------数据集下载

    三、开始讲述

    1、图片人脸检测

    (1)代码和说明

    import cv2 as cv
    import numpy as np
    
    def face_detect_demo():#人脸检测函数
        gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)#把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找
        #以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘’是有要求的
        # 通过级联检测器 cv.CascadeClassifier,加载特征数据
        # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")
        face_detector = cv.CascadeClassifier(
            "D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")
        #在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点
        faces = face_detector.detectMultiScale(gray, 1.02, 5)
        for x, y, w, h in faces:#绘制结果图
            #rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度
            cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2)
            cv.imshow("result", src)#输出结果图
    
    src = cv.imread("D:/pyproject/cv_renlianjiance/cvrenxiangpic/1.jpg")#图片是JPG和png都可以
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)#创建绘图窗口
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    face_detect_demo()
    cv.waitKey(0)
    cv.destroyAllWindows()#作用是能正常关闭绘图窗口
    123456789101112131415161718192021222324

    (2)结果展示

    2、视频中的人脸检测

    (1)代码和说明

    import cv2 as cv
    import numpy as np
    
    def face_detect_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")
        face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")
        faces = face_detector.detectMultiScale(gray, 1.02, 5)
        for x, y, w, h in faces:
            cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv.imshow("result", image)
    
    
    capture = cv.VideoCapture("D:/pyproject/cv_renlianjiance/video/1.mp4")
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    while (True):
        #按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
        ret, frame = capture.read()
        # cv.flip函数表示图像翻转,沿y轴翻转, 0: 沿x轴翻转, <0: x、y轴同时翻转
        frame = cv.flip(frame, 1)
        face_detect_demo(frame)
        #waitKey()方法本身表示等待键盘输入,参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
        c = cv.waitKey(10)
        if c == 27:#当键盘按下‘ESC’退出程序
            break
    
    #cv.waitKey(0)参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;
    cv.waitKey(0)
    cv.destroyAllWindows()#作用是能正常关闭绘图窗口
    1234567891011121314151617181920212223242526272829

    (2)结果展示

    3、利用设备上的摄像头进行人脸检测,其实和2中的代码一样,只是打开摄像头,而不是读取视频文件

    代码和说明

    import cv2 as cv
    import numpy as np
    
    def face_detect_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")
        face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")
        faces = face_detector.detectMultiScale(gray, 1.02, 5)
        for x, y, w, h in faces:
            cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv.imshow("result", image)
    
    
    capture = cv.VideoCapture(0)#其中的0表示电脑中的第一个相机
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    while (True):
        #按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
        ret, frame = capture.read()
        # cv.flip函数表示图像翻转,沿y轴翻转, 0: 沿x轴翻转, <0: x、y轴同时翻转
        frame = cv.flip(frame, 1)
        face_detect_demo(frame)
        #waitKey()方法本身表示等待键盘输入,参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
        c = cv.waitKey(10)
        if c == 27:#当键盘按下‘ESC’退出程序
            break
    
    #cv.waitKey(0)参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;
    cv.waitKey(0)
    cv.destroyAllWindows()#作用是能正常关闭绘图窗口
    1234567891011121314151617181920212223242526272829

    以上就是本文所有内容,希望能帮到大家!!!

    需要源代码或者想了解更多内容点击这里下载

    此文转载文,著作权归作者所有,如有侵权联系小编删除!

    原文地址:https://blog.csdn.net/m0_45161766/article/details/107545960

  • 相关阅读:
    git在iOS开发中的使用
    搜索联系人是去掉拼音中的空格
    xmPP(即时通讯)向远程服务器请求数据
    使用CFStringTransform进行汉字转拼音(可去掉声调)
    node的模块系统和commonJS规范的关系
    在centos7中通过使用yum安装mongoDB
    vue跨组件通信,简易状态管理的使用
    Linux(centos7) 常用命令
    前端打包后, 路由模式为history时,用express测试服务端能否正常解析路由路径
    几个文件目录树生成工具tree,treer,tree-cli,tree-node-cli的使用配置和对比
  • 原文地址:https://www.cnblogs.com/wxys/p/13773277.html
Copyright © 2011-2022 走看看