天天看点

Python人脸检测-基于opencv

一、介绍

OpenCV采用的是基于Haar的cascade分类器,它是一种机器学习方法。

基于Haar特征的cascade分类器是Paul Viola和 Michael Jone在2001年发表的论文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的物品检测方法。它是一种机器学习方法,通过许多正负样例中训练得到cascade模型,然后将其应用于其他图片。

二、函数

detectMultiScale()

参数:

1.image表示的是要检测的输入图像

2.objects表示检测到的人脸目标序列

3.scaleFactor表示每次图像尺寸减小的比例

4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),

5.minSize为目标的最小尺寸

6.minSize为目标的最大尺寸

适当调整4,5,6两个参数可以用来排除检测结果中的干扰项

三、步骤

1、初始化,导入cv2等Python库,加载分类器cascade文件;

2、图片预处理,读取图片,使用cvtColor函数将图片转为灰度图;

3、人脸检测,使用detectMultiScale方法检测图片中的人脸。

cascade目录位置查找

打开cmd,输入pip show opencv-python

Python人脸检测-基于opencv

打开目录

Python人脸检测-基于opencv

data目录下是所有的分类器模型文件

Python人脸检测-基于opencv

程序示例

1、图片识别人脸

import numpy
import cv2

face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")

#读取图片,使用cvtColor函数将图片转为灰度图
img = cv2.imread("all.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#检测图片中的人脸
#faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray)

#将人脸部分用长方形表示
print(faces)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)

#保存结果
cv2.imwrite("result.jpg",img)
print("检测完成,生成结果图片\n")

           
Python人脸检测-基于opencv

识别结果

Python人脸检测-基于opencv

2、摄像头识别人脸

import cv2 as cv
import numpy as np

def face_detect(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier("lbpcascades/lbpcascade_frontalcatface.xml")
    faces = face_detector.detectMultiScale(gray, 1.02, 5)
    #faces = face_detector.detectMultiScale(gray)
    for x, y, w, h in faces:#给人脸添加矩形框
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
    return 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)
    frame = face_detect(frame)
    cv.imshow("result", 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()#作用是能正常关闭绘图窗口
           

总结

因为没有设置参数,所有会有一些误识别,还是识别到了所有人脸

继续阅读