记录一下人脸识别

发布于 / Python / 4 条评论

一、需要安装OpenCV库及相关库


python -m pip install --upgrade pip
pip install opencv-python
pip install opencv-contrib-python
pip install Pillow
pip3 install --user numpy scipy matplotlib

二、使用OpenCV 读取显示和保存头像

#加载OpenCV库
import cv2
#读取图像(以灰度方式读取图像)
img = cv2.imread('b.jpg',cv2.IMREAD_GRAYSCALE)
#显示图像
cv2.imshow('image',img)
#保持画面持续,0表示无限持续
cv2.waitKey(0)
#保存图像
cv2.imwrite('b_2.jpg',img)

三、人脸识别实例

需要将
haarcascade_frontalface_default.xml
haarcascade_eye_tree_eyeglasses.xml
放入当前文件夹 或者你使用绝对路径也可以
这两个文件在\python\Lib\site-packages\cv2\data\ 里面


电脑没有摄像头的话可以使用手机当摄像头 在手机(安卓\IOS都可以)和电脑上面下载iVcam 并用数据线连接起来
下载地址:https://www.e2esoft.cn/ivcam/

然后我发现我的台式电脑 使用上面那个软件 是0才可以运行 也就是选择笔记本摄像头才可以 如果你选的1 USB摄像头没有反应 不妨试试0 笔记本摄像头

人脸识别框

# 加载OpenCV库
import cv2

# 加载检测人脸分类器
faceClassifier = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
# 开启摄像头,0:笔记本摄像头,1:USB摄像头
cap = cv2.VideoCapture(0)
while True:
    # 捕获视频帧
    # read()函数返回两个值:布尔值和视频帧
    ret, img = cap.read()
    # 图像灰度化
    gray = cv2.cvtColor(img,cv2.COLOR_BGRA2GRAY)
    # 检测人脸
    faceRects = faceClassifier.detectMultiScale(gray, 1.3, 5)
    # 画矩形
    for (x, y, w, h) in faceRects:
        img = cv2.rectangle(img, (x,y), (x+h, y+w), (0,255,0), 2) 
    # 显示图像
    cv2.imshow('camera', img)
    # 保持画面持续
    key = cv2.waitKey(1)
    # 按空格键保存,保存路径为当前目录
    if key == ord(" "):
        cv2.imwrite("abc.jpg", img)
    # 按Esc退出
    if key == 27:
        break
# 关闭摄像头
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()

带眼睛的人脸识别框


# 加载OpenCV库
import cv2

# 人脸分类器
faceClassifier = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
# 识别眼睛分类器
eyeClassifier = cv2.CascadeClassifier(r'haarcascade_eye_tree_eyeglasses.xml')
# 开启摄像头,0:笔记本摄像头,1:USB摄像头
cap = cv2.VideoCapture(1)

while True:
    # 捕获视频帧
    ret, img = cap.read()
    # 图像灰度化
    gray = cv2.cvtColor(img,cv2.COLOR_BGRA2GRAY)
    # 检测人脸
    faceRects = faceClassifier.detectMultiScale(gray, 1.3, 5)
    # 检测眼睛
    for (x, y, w, h) in faceRects:
        face_gray = gray[y:(y+h), x:(x+w)]
        result = []
        eyes = eyeClassifier.detectMultiScale(face_gray, 1.3, 3)
        # 眼睛坐标的换算,将相对位置换成绝对位置
        for (ex, ey, ew, eh) in eyes:
            result.append((x+ex, y+ey, ew, eh)) 
    # 画矩形
    for (x, y, w, h) in faceRects:
        img = cv2.rectangle(img, (x,y), (x+h, y+w), (0,255,0), 2)
        for (ex, ey, ew, eh) in result:
            cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0,255,0), 2)  
    # 显示图像
    cv2.imshow('camera', img)
    # 保持画面持续
    key = cv2.waitKey(1)
    # 按空格键保存,保存路径为当前目录
    if key == ord(" "):
        cv2.imwrite("abc.jpg", img)
    # 按Esc退出
    if key == 27:
        break
# 关闭摄像头
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()

二、采集人脸数据 训练 并识别

"""
********************** 采集人脸数据 *************************
"""
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import random

# 将捕获照片的大小裁剪为正方形
def getpaddingSize(shape):
    # 照片的长和宽
    h, w = shape
    longest = max(h, w)
    # 将最长的边进行处理
    result = (np.array([longest]*4, int) - np.array([h, h, w, w], int)) // 2
    return result.tolist()

# 图像去噪处理,使得训练出来的模型具备一定的泛化能力
def dealwithimage(img, h=64, w=64):
    top, bottom, left, right = getpaddingSize(img.shape[0:2])
    img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
    img = cv2.resize(img, (h, w))
    return img

# 改变亮度与对比度
def relight(imgsrc, alpha=1, bias=0):
    imgsrc = imgsrc.astype(float)
    imgsrc = imgsrc * alpha + bias
    imgsrc[imgsrc < 0] = 0
    imgsrc[imgsrc > 255] = 255
    imgsrc = imgsrc.astype(np.uint8)
    return imgsrc

# 捕获人脸
def GetFace(name,face_id):
    # 0: 笔记本内置摄像头; 1: USB摄像头
    camera = cv2.VideoCapture(0)
    # 获取分类器
    face_detector = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
    count = 1
    while True:
        # 默认获取100张图片作为训练数据集
        if(count<=100):
            print("It's processing %s image." % count)
            # 读取图片
            success,img = camera.read()
            # 图片灰度化
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # 检测人脸
            faces = face_detector.detectMultiScale(gray,1.3,5)
            for (x, y, w, h) in faces:
                # 图像预处理,处理成64*64大小的图片
                face = gray[y:y+h, x:x+w]
                face = cv2.resize(face, (64, 64))
                # 图像去噪处理
                face = dealwithimage(face)
                # 改变亮度与对比度
                face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
                # 保存图片
                cv2.imwrite("zjh/zjh" + str(face_id) + '.' + str(count) + '.jpg', face)
                # 在图片上显示名字
                cv2.putText(img, name, (x, y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
                # 画一个矩形
                img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
                count+=1
            cv2.imshow('img', img)
            # 保持画面持续
            key = cv2.waitKey(30)&0xff
            # Esc退出
            if key == 27:
                break
        else:
            break
    # 关闭摄像头
    camera.release()
    cv2.destroyAllWindows()

# 主程序入口
if __name__ == "__main__":
    # 请输入您的name和face_id
    name = input('Please input your name: ')
    face_id = input('Please input face id: ')
    GetFace(name,face_id)    

"""
********************** 训练人脸模型 *************************
"""
# -*- coding: utf-8 -*-
import os
import cv2
from PIL import Image
import numpy as np

# 人脸训练集路径
path = 'D:\pycode\zjh'
# 初始化识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 获取分类器
detector = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')

# 获取图像及标签
def getImagesAndLabels(path):
    # join函数的作用
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]  
    faceSamples = []
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L')   
        img_numpy = np.array(PIL_img, 'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x, y, w, h) in faces:
            faceSamples.append(img_numpy[y:y + h, x: x + w])
            ids.append(id)
    return faceSamples, ids

# 主程序入口
if __name__ == "__main__":
    print('Training faces. It will take a few seconds. Waiting...')
    faces, ids = getImagesAndLabels(path)
    # 开始训练
    recognizer.train(faces, np.array(ids))         
    print('Training has finished!')
    # 保存文件
    recognizer.write(r'a.yml')  
    print("{0} faces trained. Exiting Program.".format(len(np.unique(ids))))

    
"""
********************** 人脸识别 ***************************
"""
# -*- coding: utf-8 -*-
import cv2

# 初始化识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 加载训练好的模型文件
recognizer.read('a.yml')
# 获取分类器
faceCascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
# 设置图片显示的字体
font = cv2.FONT_HERSHEY_SIMPLEX

idnum = 0
# 用户需要在此添加自己的姓名(拼音),下标序号要与名字对应(ID从0开始,依次递增)
names = ['zjh','28']

# 捕获图像
camera = cv2.VideoCapture(0)
# 设置格式
minW = 0.1*camera.get(3)
minH = 0.1*camera.get(4)

# 主函数
def main():
    while True:
        # 读取图片
        success,img = camera.read()
        # 图片灰度化
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 检测人脸
        faces = faceCascade.detectMultiScale(
            gray,
            scaleFactor=1.3,
            minNeighbors=5,
            minSize=(int(minW), int(minH))
        )
        for (x, y, w, h) in faces:
            # 画一个矩形
            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
            # 图像预测
            idnum,confidence = recognizer.predict(gray[y:y+h, x:x+w])
            # 阈值为120    
            if confidence < 120:
                idnum = names[idnum]
                confidence = "{0}%".format(round(100 - confidence))
            else:
                idnum = "unknown"
                confidence = "{0}%".format(round(100 - confidence))
            cv2.putText(img, str(idnum), (x+5, y-5), font, 1, (230, 250, 100), 1)
            cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (255, 0, 0), 1)
        cv2.imshow('camera', img)
        # 保持画面持续
        key = cv2.waitKey(10)
        # Esc退出
        if key == 27:
            break
    # 关闭摄像头
    camera.release()
    cv2.destroyAllWindows()
    
# 主程序入口
if __name__ == "__main__":
    print('请正对着摄像头...')
    main()

这个识别本人的时候 如过你发现运行秒退 不妨遮着摄像头在运行 或者让你朋友来点运行 会显示未知名字 以及相似度??? 然后你本人进去 会识别成功 然后退出

  1. 博主用的python几

    1. @暖风 3.10
  2. 这个训练的最后好像就是用来识别一个人的,识别到后立刻退出,或许可以用去放老板,比老板键好用(doge

    1. @暖风 hhhhh