基于Opencv的Python人脸识别

使用前需要pip三个库,如下:

pip install opencv2-python

pip install opencv-contrib-python

pip install Image

本人python刚学没多久如果有任何错误欢迎指出

1.捕获摄像头并且截图,用于训练

# 捕获人脸图片
import cv2 as cv

if __name__ == "__main__":
    # 监视摄像头,0是自带的摄像头,如果有其它设备可以将0改为其他数字试试
    video = cv.VideoCapture(0)
    # 方便给照片命名
    num = 0
    # 按下s捕获,按下q退出
    while True:
        status, frame = video.read()
        # 显示每一帧
        cv.imshow('myself video listen', frame)

        if not status:
            break
        # 按下s捕获,图片保存在face_image文件夹下
        if ord('s') == cv.waitKey(0):
            cv.imwrite('保存图片的文件夹路径'+str(num)+'.name.png', frame)
            num += 1
        # 按q退出
        if ord('q') == cv.waitKey(0):
            break

    # 释放空间
    video.release()
    cv.destroyAllWindows()

2.训练数据

# 数据训练
import cv2 as cv
import numpy as np
import os
from PIL import Image

# 训练每一张照片


def train(path):
    # 路径列表,包含了路径中的所有图片的名字
    paths = [os.path.join(path, file) for file in os.listdir(path)]

    # 人脸数据据列表
    faces = []

    # id列表
    ids = []

    # 导入分类器
    face_detect = cv.CascadeClassifier(r'分类器目录')

    # 遍历每一张图片
    for image_path in paths:
        # 以灰度模式打开图片
        gray_image = Image.open(image_path).convert('L')
        # 将图片转化为数组,以黑白深浅
        face_character = np.array(gray_image, 'uint8')
        # 人脸识别,方便获取人脸范围的x,y,w,h,方便将人脸数据范围追加到faces列表中
        face = face_detect.detectMultiScale(face_character)
        # 获取照片的id,将string改为int
        id = int(os.path.split(image_path)[1].split('.')[0])
        # 将得到的人脸数据写入到相应列表中,这样写是为了防止未识别面容的出现
        for x, y, w, h, in face:
            # ids追加id
            ids.append(id)
            # faces只需要追加扫描到的人脸的范围即可,这里面追加的是变成数组的照片信息
            faces.append(face_character[y:y+h, x:x+w])
    # 返回列表
    return faces, ids


if __name__ == "__main__":
    path = '自己想要训练的人脸数据的照片的文件夹路径,图片的命名格式是1.name.png'
    # 将得到的人脸数据和id数据保存
    faces, ids = train(path)
    # 加载识别器
    recognizer = cv.face.LBPHFaceRecognizer.create()
    # 训练
    recognizer.train(faces, np.array(ids))
    # 保存
    recognizer.write('数据保存路径,数据的后缀名是yml')

3.人脸识别 

import cv2 as cv

# 加载识别器
recognizer = cv.face.LBPHFaceRecognizer.create()

# 加载数据
recognizer.read('人脸数据的保存路径')

# 图像处理


def face_detect_demo(img):
    # 转换为灰度图像
    gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载分类器
    face_detect = cv.CascadeClassifier(r'分类器路径')
    # 人脸识别
    face = face_detect.detectMultiScale(
        gray_img, 1.1, 5, 0, (100, 100), (900, 900))
    for x, y, w, h in face:
        # 对识别的人脸评分
        ids, confidence = recognizer.predict(gray_img[y:y+h, x:x+w])
        # 小于60说明可信
        if confidence < 60:
            # 在原图上用绿色方框框住,并且注明identified
            cv.rectangle(img, (x, y, w, h), color=(0, 255, 0), thickness=2)
            cv.putText(img, 'identified', (x+10, y-10), 3, 0.5, (0, 255, 0), 1)
        else:
            # 在原图上用红色方框框住,并且注明unkown
            cv.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=2)
            cv.putText(img, 'unkown', (x+10, y-10), 3, 0.5, (0, 0, 255), 1)
    # 显示图片
    cv.imshow('img', img)


if __name__ == "__main__":
    # 监视摄像头
    video = cv.VideoCapture(0)

    while True:
        status, frame = video.read()
        if not status:
            break
        face_detect_demo(frame)
        if ord('q') == cv.waitKey(0):
            break

    # 释放内存
    video.release
    cv.destroyAllWindows()

 有任何错误欢迎大家指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值