使用OpenCV训练好的级联分类器识别人脸

时间:2024-03-07 18:03:28

一、使用OpenCV训练好的级联分类器来识别图像中的人脸

当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载:

OpenCV分类器

import cv2
# 矩形颜色和描边
color = (0,0,255)       # 红色框
strokeWeight = 1        # 线宽为 1
windowName = "Object Detection"
img = cv2.imread("lena.jpg")

# 加载检测文件
cascade = cv2.CascadeClassifier("F:/opencv-master/data/haarcascades/haarcascade_frontalface_alt.xml")

rects = cascade.detectMultiScale(img)
 
# 获取矩形列表
for x,y, width,height in rects:
    cv2.rectangle(img, (x,y), (x+width, y+height), color, strokeWeight)

# 显示
cv2.imshow(windowName, img)
cv2.waitKey(0)

效果如图所示:

 

二、检测摄像头视频中的人脸

原理和在图片中检测出人脸差不多,都是加载训练好的分类器。

import cv2
import time
import numpy as np
print(\'Press Esc to exit\')

# 加载分类器
faceCascade = cv2.CascadeClassifier(\'F:/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml\')
imgWindow = cv2.namedWindow(\'FaceDetect\', cv2.WINDOW_NORMAL)
def detect_face():
    capInput = cv2.VideoCapture(0)
    # 避免处理时间过长造成画面卡顿
    nextCaptureTime = time.time()
    faces = []
    
    # 检测摄像头是否读取数据
    if not capInput.isOpened(): 
        print(\'Capture failed because of camera\')
    while 1:
        ret, img = capInput.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        if nextCaptureTime < time.time():
            nextCaptureTime = time.time() + 0.1
            
            # 使用模板匹配图形
            faces = faceCascade.detectMultiScale(gray, 1.3, 5)
        if np.all(faces != None):
            for x, y, w, h in faces:
                # 用蓝色框框出
                # 函数的参数分别为:图像,左上角坐标、右下角坐标、颜色、宽度
                img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        cv2.imshow(\'FaceDetect\', img)
        # 这是简单的读取键盘输入,27即Esc的acsii码
        if cv2.waitKey(1) & 0xFF == 27: break
    capInput.release()
    cv2.destroyAllWindows()

detect_face()

效果不错,就不展示图了(不想展示脸。。。。)