OpenCV 简单的人脸识别

OpenCV中自带已训练好的检测器,包括面部,眼睛,猫脸等,都保存在XML文件中,我们可以通过以下程序找到他们:

import cv2 as cv
print(cv.__file__)

找到的文件如下所示:
在这里插入图片描述

opencv中人脸识别的流程是:

  1. 读取图片,并转换成灰度图

  2. 实例化人脸和眼睛检测的分类器对象

# 实例化级联分类器
classifier =cv.CascadeClassifier( "haarcascade_frontalface_default.xml" ) 
# 加载分类器
classifier.load('haarcascade_frontalface_default.xml')
  1. 进行人脸和眼睛的检测
rect = classifier.detectMultiScale(gray, scaleFactor, minNeighbors, minSize,maxsize)

参数:

  • Gray: 要进行检测的人脸图像
  • scaleFactor: 前后两次扫描中,搜索窗口的比例系数
  • minneighbors:目标至少被检测到minNeighbors次才会被认为是目标
  • minsize和maxsize: 目标的最小尺寸和最大尺寸
  1. 将检测结果绘制出来。
在图片中对人脸进行检测:
import cv2 as cv
import matplotlib.pyplot as plt

# 1.以灰度图的形式读取图片
img = cv.imread("img.png")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2.实例化OpenCV人脸和眼睛识别的分类器 
face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
face_cas.load('haarcascade_frontalface_default.xml')

eyes_cas = cv.CascadeClassifier("haarcascade_eye.xml")
eyes_cas.load("haarcascade_eye.xml")

# 3.调用识别人脸 
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
    x, y, w, h = faceRect
    
    # 框出人脸 
    cv.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 3)
    
    # 4.在识别出的人脸中进行眼睛的检测
    roi_color = img[y:y+h, x:x+w]
    roi_gray = gray[y:y+h, x:x+w]
    eyes = eyes_cas.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)

# 5. 检测结果的绘制
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]),
plt.title('检测结果')
plt.xticks([]),
plt.yticks([])
plt.show()
在摄像头中对人脸进行检测:
import cv2 as cv

# 1.读取摄像头
cap = cv.VideoCapture(0)

# 2.在每一帧数据中进行人脸识别
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

        # 3.实例化OpenCV人脸识别的分类器
        face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
        face_cas.load('haarcascade_frontalface_default.xml')

        # 4.调用识别人脸
        faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        for faceRect in faceRects:
            x, y, w, h = faceRect

            # 框出人脸
            cv.rectangle(frame, (x, y), (x + h, y + w), (0, 255, 0), 3)
            
        cv.imshow("frame", frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
            
# 5. 释放资源
cap.release()
cv.destroyAllWindows()
文件名功能
haarcascade_lefteye_2splits.xml可用来检测睁开或闭着的眼睛
haarcascade_eye.xml可用来检测睁开或闭着的眼睛
haarcascade_eye_tree_eyeglasses.xml仅在带被检测者戴眼镜时方可检测
haarcascade_frontalcatface猫脸检测
haarcascade_frontalcatface_extended猫脸检测
haarcascade_smile微笑检测
haarcascade_upperbody人体上半部分检测
haarcascade_russian_plate_number.xml俄罗斯车牌识别
haarcascade_righteye_2splits用于进行人脸和人眼检测
haarcascade_profileface侧脸检测
haarcascade_lowerbody身体下半部分检测
licence_plate_rus_16stages俄罗斯汽车牌照检测
haarcascade_fullbody人体全身检测
haarcascade_frontalface_default人脸识别
haarcascade_frontalface_alt2人脸识别
haarcascade_frontalface_alt_tree人脸识别
haarcascade_frontalface_alt.xml人脸识别

haarcascade_frontalface_default.xml下载:
https://github.com/opencv/opencv/tree/master/data/haarcascades

# -*- coding: utf-8 -*-
import cv2
import time

cap = cv2.VideoCapture(0)
ret = cap.set(3, 640)  # 设置帧宽
ret = cap.set(4, 480)  # 设置帧高
font = cv2.FONT_HERSHEY_SIMPLEX  # 设置字体样式
face_cascade = cv2.CascadeClassifier('/home/pi/Desktop/haarcascade_frontalface_default.xml')

class FaceDetector():
    def __init__(self):
        self.start_video()

    def api_init(self):
        print("process start")

    def start_video(self):
        while cap.isOpened():
            ret, frame = cap.read()
            src = frame.copy()
            result = frame.copy()
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, 1.3, 5)

            for (x, y, w, h) in faces:
                result = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

            if faces is not None:
                if len(faces) == 1:
                    (fx, fy, fw, fh) = faces[0]
                    target_face_x = fx + fw / 2
                    offset_x = target_face_x - 640 / 2
                    offset_x = -offset_x

            cv2.imshow("result", result)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        cap.release()
        cv2.destroyAllWindows()


if __name__ == '__main__':
    face_detector = FaceDetector()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值