小白学python(opencv人脸检测)

412 阅读3分钟

人脸检测

做人脸识别,首先要检测出图片/视频中的人脸,这里主要用特征数据HAAR和LBP,我这也是感觉不是很熟练,HAAR和LBP都能实现对人脸特征的提取,一般都在github上下载,但那下载贼慢,我这里会把我用的文件发给大家。 百度网盘:链接:pan.baidu.com/s/1mitYMtOl… 提取码:k9p3 人脸检测不是人脸识别,两者有天差地别的区别,这里说实话我只是调用别人的数据来进行的简单操作而已。 在这里插入图片描述

级联分类器

级联分类器,即使用类 Haar 特征工作的级联增强分类器,是集成学习的一种特殊情况,称为 boost。它通常依赖于 Adaboost 分类器(以及其他模型,如 Real Adaboost、Gentle Adaboost 或 Logitboost)。

在这里插入图片描述

我们可以看到这里可以对人脸的很多部位做检测,这里我们就搞一个最简单的脸部检测就好了。

识别图片

代码:

import cv2 as cv


def main():
    pitcurepath = "C:/Users/POG/Desktop/49d2d78cd115011da7c9b4aa54f5460b.jpg"
    global src
    src = cv.imread(pitcurepath)
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.namedWindow("results",cv.WINDOW_AUTOSIZE)
    cv.imshow("input image",src)
    face_detect_demo()
    cv.waitKey(0)  # 等待
    cv.destroyAllWindows()  # 销毁窗口

def face_detect_demo():
    #把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找
    #以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘\’是有要求的
    # 通过级联检测器 cv.CascadeClassifier,加载特征数据
    gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
    #告诉OpenCV使用人脸识别分类器
    face_detector = cv.CascadeClassifier("C:/Users/POG/Desktop/haarshare/haarcascade_frontalface_alt_tree.xml")
    #在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点
    faces = face_detector.detectMultiScale(gray,1.02,2)#这里对人脸检测数值进行动态调整
    for x,y,w,h in faces:
        #rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度
        cv.rectangle(src,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("results",src)


if __name__ =="__main__":
    main()

结果: (这里当然是用我最喜欢的霉霉啦!) 在这里插入图片描述

识别视频

其实和识别图片差不多的,只是多了一个打开视频而已,因为视频也是一帧一帧当成图片处理的。

import cv2 as cv


def main():
    pitcurepath = "C:/Users/POG/Desktop/49d2d78cd115011da7c9b4aa54f5460b.jpg"
    global src
    #src = cv.imread(pitcurepath)
    capture = cv.VideoCapture(0)
    #cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.namedWindow("results", cv.WINDOW_AUTOSIZE)

    while(True):
        ret,frame = capture.read()
        frame = cv.flip(frame,1)
        face_detect_demo(frame)
        c = cv.waitKey(10)
        if (c == 27):  # esc为27
            break
    #cv.imshow("input image", image)
    #face_detect_demo()
    cv.waitKey(0)  # 等待
    cv.destroyAllWindows()  # 销毁窗口

def face_detect_demo(image):
    #把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找
    #以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘\’是有要求的
    # 通过级联检测器 cv.CascadeClassifier,加载特征数据
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #告诉OpenCV使用人脸识别分类器
    face_detector = cv.CascadeClassifier("C:/Users/POG/Desktop/haarshare/haarcascade_frontalface_alt_tree.xml")
    #在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点
    faces = face_detector.detectMultiScale(gray,1.02,2)
    for x,y,w,h in faces:
        #rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("results",image)
    #cv.waitKey(10)


if __name__ =="__main__":
    main()

结果: (这里就献上自己的丑照,大家莫怪。。) 在这里插入图片描述 (呜呜为什么我的霉霉检测一会有一会没有,是不是侧着脸所以不太行?) 在这里插入图片描述 那今天就先写到这里啦,有时间再学叭。