OpenCV人脸识别实例


2020年5月29日学习了b站 人脸识别的简单教程,笔记记录于此

1.图片基本处理

import cv2 as cv

# 读取图片,路径中不能有中文
img = cv.imread('img.jpg')
# 显示图片
cv.imshow('BGR_img', img)

# 修改图片尺寸
resize_img = cv.resize(img, dsize=(210, 210))
print('原来图片的尺寸', img.shape, '\n修改后的图片尺寸', resize_img.shape)
"""
原来图片的尺寸 (689, 690, 3) 
修改后的图片尺寸 (210, 210, 3)
"""

# 将图片灰度转换
gray_img = cv.cvtColor(resize_img, cv.COLOR_BGR2GRAY)
cv.imshow('gray_img', gray_img)
# 保存图片
cv.imwrite('gray_img.jpg', gray_img)

# 只有输入q的时候退出q
# while True:
#     if ord('q') == cv.waitKey(0):
#         break

# 等待键盘的输入,单位为毫秒,传入0无限等待
cv.waitKey(3000)
# opencv底层是C++语言,使用完内存必须释放内存
cv.destroyAllWindows()

2.图片和视频人脸检测

import cv2 as cv

def face_detect_demo(img):
    # 将图片转换为灰度
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载特征数据
    face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
    # faces = face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=2,maxSize=(42,42),minSize=(28,28))
    faces = face_detector.detectMultiScale(gray)
    for x, y, w, h in faces:
        # 绘制矩形边框
        cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2)
        # 绘制圆形边框
        cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)
    cv.imshow('result', img)

# 加载图片
img = cv.imread('face.jpg')
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()

# 读取视频
cap = cv.VideoCapture('video.mp4')
while True:
    flag, frame = cap.read()
    print('flag:', flag, 'frame.shape:', frame.shape)
    if not flag:
        break
    face_detect_demo(frame)
    if ord('q') == cv.waitKey(10):
        break
cv.destroyAllWindows()
cap.release()

多张人脸时检测效果不好
在这里插入图片描述

3.训练数据和人脸识别

import os
import cv2 as cv
import PIL.Image
import numpy as np

def getImageAndLabels(path):
    facesSamples = []
    ids = []
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    print(imagePaths)
    # 检测人脸
    face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
    # 遍历列表中所有图片
    for imagePath in imagePaths:
        # 打开图片
        PIL_img = PIL.Image.open(imagePath).convert('L')
        # 将图像转换为数组
        img_numpy = np.array(PIL_img, 'uint8')
        faces = face_detector.detectMultiScale(img_numpy)
        # 获取每张图片的id
        id = int(os.path.split(imagePath)[1].split('.')[0])
        for x, y, w, h in faces:
            # 人脸区域切片
            facesSamples.append(img_numpy[y:y+h, x:x+h])
            ids.append(id)
    return facesSamples, ids


if __name__ == '__main__':
    # 1.训练数据
    path = './data/jm/'     # 图片路径
    # 获取图像数组和id标签数组
    faces, ids = getImageAndLabels(path)
    # 获取训练对象,加载训练集数据集文件
    recognizer = cv.face.LBPHFaceRecognizer_create()
    recognizer.train(faces, np.array(ids))
    # 保存文件
    recognizer.write('trainer/trainer.yml')

    # 2.人脸识别
    # 读取已经训练好的文件
    recognizer.read('trainer/trainer.yml')
    # 准备识别的图片
    img = cv.imread('11.pgm')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
    faces = face_detector.detectMultiScale(gray)
    for x, y, w, h in faces:
        cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 人脸识别
        id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
        print('标签id:', id, '置信评分:', confidence)
    cv.imshow('result', img)
    cv.waitKey(0)
    cv.destroyAllWindows()

输出结果:
在这里插入图片描述

['./data/jm/1.pgm', './data/jm/10.pgm', './data/jm/11.pgm', './data/jm/12.pgm', './data/jm/13.pgm', './data/jm/14.pgm', './data/jm/15.pgm', './data/jm/2.pgm', './data/jm/3.pgm', './data/jm/4.pgm', './data/jm/5.pgm', './data/jm/6.pgm', './data/jm/7.pgm', './data/jm/8.pgm', './data/jm/9.pgm']
标签id: 11 置信评分: 0.0
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值