OpenCV计算机视觉(Python实现)-3:人脸检测和识别

第5章:人脸检测和识别(原书第二版目录)

5.1 Haar级联的概念

5.2 获取Haar级联数据

5.3 使用OpenCV进行人脸检测

5.3.1 静态图像中的人脸检测

5.3.2 视频中的人脸检测

5.3.3 人脸识别

5.4 总结


类Haar特征:一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。

窗口大小:对给定图像,特征会因区域大小而有所不同

级联:图像之间的特征集合。Haar级联具有尺度不变性,也即尺度变化上具有鲁棒性

OpenCV提供的Haar级联不具有旋转不变性



静态图像中的人脸检测

import cv2
filename = 'img/Img.jpg'
def detect(filename):
    face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 转换为灰度图像
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    # scaleFactor表示人脸检测过程中每次迭代时图片的压缩率(1.3)
    # minNeighbors:每个人脸矩形保留近邻数目的最小值(5)
    for (x, y, w, h) in faces:
        # 通过坐标绘制矩形,x,y是左上角坐标;w,h分别是宽度和高度
        img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
        # 其中参数的含义:(255, 0, 0)表示颜色, 2表示线条粗细
    cv2.namedWindow('Viking Detected!!')
    cv2.imshow('Viking Detected!!', img)
    cv2.imwrite('/img/viking.jpg', img)
    cv2.waitKey(0)
detect(filename)


代码中的两个参数不太理解,标记一下。scaleFactor和minNeighbors

minNeighbors为5的时候,表明至少有5次重叠检测。


调为1的时候


调为0的时候,百度上的解释是:此时函数不做任何操作就返回所有的被检候选矩形框



视频中的人脸检测

效果不是很好,脸可以准确识别,但是眼睛识别不了。

对于脸部的识别一旦有遮挡也是无法识别。

import cv2
def detect():
    face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
    camera = cv2.VideoCapture('video/input.avi')    # 读取视频文件
    while(True):
        ret, frame = camera.read()  # 从视频中获取布尔值(是否读取帧)以及帧本身
        if ret == True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            break
        faces = face_cascade.detectMultiScale(gray, 1.3, 3)
        for (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
            roi_gray = gray[y:y+h, x:x+w]
            eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(img, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
        cv2.imshow("camera", frame)
        if cv2.waitKey(1000//50) & 0xff == ord("q"):
            break
    camera.release()
    cv2.destroyAllWindows()
if __name__ =="__main__":
    detect()


在网上找的另一段代码,记录一下:OpenCV-Python 摄像头实时识别人脸

代码相比简洁一些,本质还是一样的。

import cv2

cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml') # 加载人脸特征库

while(True):
    ret, frame = cap.read() # 读取一帧的图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰

    faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 5, minSize = (5, 5)) # 检测人脸
    for(x, y, w, h) in faces:
        cv2.rectangle(gray, (x, y), (x + w, y + h), (0, 255, 0), 2) # 用矩形圈出人脸

    cv2.imshow('Face Recognition', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release() # 释放摄像头
cv2.destroyAllWindows()



人脸识别

实现人脸识别的方法之一:用一系列分好类的图像(人脸数据库)来训练程序,并基于这些图像进行识别

1、生成人脸识别数据

import cv2
def generate():
    face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
    camera = cv2.VideoCapture(0)  # 使用第一个摄像头
    count = 0
    while (True):
        ret, frame = camera.read()
        if ret == True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            break
        faces = face_cascade.detectMultiScale(gray, 1.3, 3)
        for (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))
            cv2.imwrite('jm/%s.pgm' % str(count), f)
            count += 1
        cv2.imshow("camera", frame)
        if cv2.waitKey(1000 // 50) & 0xff == ord("q"):
            break
    camera.release()
    cv2.destroyAllWindows()
if __name__ == "__main__":
    generate()

运行生成


2、人脸识别

OpenCV3有三种人脸识别方法,基于三种不同算法:Eigenfaces、Fisherfaces、Local Binary Pattern Histogram(LBPH)

书中贴了几个链接

Principal Component Analysis(PCA):https://arxiv.org/pdf/1404.1100v1.pdf

下略


3、准备训练数据

需要两个数组:图像数组和标签数组。创建一个基于逗号分隔符的CSV文件,用来根据ID记录样本图像的路径。


4、加载数据并识别人脸

书本上的代码,还有一点不明白。

5、基于Eigenfaces的人脸识别

6、基于Fisherfaces的人脸识别

7、基于LBPH的人脸识别

8、通过置信度评分来丢弃结果






猜你喜欢

转载自blog.csdn.net/jesmine_gu/article/details/80987134