• 利用opencv 做一个简单的人脸识别


    • 想开发一个属于自己的人脸识别系统, 动手开始吧
      本项目源代码 github 戳我戳我戳我
      本项目演示视频 B站戳我戳我戳我
      在这里插入图片描述
    • 加入界面的效果
      在这里插入图片描述

    安装

    • opencv 和 包模块opencv-contrib-python
    • 安装失败的解决方案
    pip uninstall opencv-python
    pip uninstall opencv-contrib-python
    
    pip install opencv-python
    pip install opencv-contrib-python
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 完成后重启就可以了

    实现

    • 先对人脸进行识别
    • 获取人脸特征图片并截取 灰度图保存
    • 进行人脸模型训练
    • 测试运行

    人脸识别

    • 运用了opencv 的人脸识别框架
    face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    
    • 1
    • 截取800 帧的人脸图片 并保存数据图片
    face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    VIDEO_PATH = 'video/hero2.mp4'
    face_id = 2
    #sampleNum用来计数样本数目
    count = 0
    SAVE_PATH = 'data/'
    
    cap = cv.VideoCapture(VIDEO_PATH)
    count = 0
    while cap.isOpened():
        ret, img = cap.read()
        if ret is not None:
            if img is None:
                continue
            img = imutils.resize(img, width=600)
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            face = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x, y, w, h) in face:
                cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0))
                count += 1
                if not os.path.exists(SAVE_PATH + 'user.' + str(face_id)):
                    os.mkdir(SAVE_PATH + 'user.' + str(face_id))
                cv.imwrite(SAVE_PATH + 'user.' + str(face_id) + "/count_" + str(count) + ".jpg", gray[y: y + h, x: x + w])
            if count >= 800:
                break   
            cv.imshow('h', img)
            key = cv.waitKey(1)
            if key == 27:
                break
        else:
            break
    cap.release()
    cv.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述
    在这里插入图片描述
    测试用一个宝藏up主的人脸测试,打扰了,你要火

    进行人脸模型训练

    • 运用opencv 的face mok
    • recog = cv.face.LBPHFaceRecognizer_create()
    # 人脸识别器
    import time
    
    
    recog = cv.face.LBPHFaceRecognizer_create()
    recog.read('trainner/face.yaml')
    #创建一个函数,用于从数据集文件夹中获取训练图片,并获取id
    time_start = time.process_time()
    def get_imgs_labels():
        face_id = 0
        face_arr = []
        face_ids = []
        for user_id in os.listdir(SAVE_PATH):
            face_id = user_id.split('.')[1]
            user_path = SAVE_PATH + user_id
            image_paths = [os.path.join(user_path, key) for key in os.listdir(user_path)]
            for path in image_paths:
                face_ids.append(int(face_id))
                img = cv.imread(path, 0)
                # img_arr = np.array(img, dtype="uint8")
                face_arr.append(img)
        return face_arr, face_ids
    
    face_arr, face_ids = get_imgs_labels()
    time_end = time.process_time ()
    print('runTime' + str((time_end - time_start)))
    recog.train(train_img_gen)
    print('train' + str((time.process_time () - time_end)))
    recog.save('trainner/face.yaml')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 训练完保存了一个模型文件
    • 在这里插入图片描述

    识别人脸测试

    • 先用人脸识别出人脸区域,截取出人脸区域,进行灰度化
    • 输入到模型中预测
    • 图片展示
    VIDEO_PATH = 'video/hero3.mp4'
    font = cv.FONT_HERSHEY_SIMPLEX
    idNum = 0
    names = ['unknow', 'cc', 'dm']
    cap = cv.VideoCapture(VIDEO_PATH)
    while cap.isOpened():
        ret, img = cap.read()
        img = imutils.resize(img, width=600)
        if ret is not None:
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            face = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x, y, w, h) in face:
                cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0))
                id, conf = recog.predict(gray[y: y+h, x: x+w])
                user = ''
                if conf < 100:
                    user = names[id]
                    conf = "{0}%".format(round(100-conf))
                else:
                    user = "unknown"
                    conf = "{0}%".format(round(100-conf))
                cv.putText(img, user, (x + 5, y - 5), font, 1, (0,255, 0), 1)
                cv.putText(img, str(conf), (x + 50, y - 5), font, 1, (0,255, 0), 1)
            cv.imshow('face', img)
            key = cv.waitKey(1)
            if key == 27:
                break
    cap.release()
    cv.destroyAllWindows()
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    效果展示

    在这里插入图片描述
    在这里插入图片描述

    • 下面这个是训练的视频,上面是测试的视频

    完整代码

    # %%
    import cv2 as cv 
    import numpy as np
    import imutils
    import os
    from PIL import Image
    
    # %%
    face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    VIDEO_PATH = 'video/hero2.mp4'
    face_id = 2
    #sampleNum用来计数样本数目
    count = 0
    SAVE_PATH = 'data/'
    
    cap = cv.VideoCapture(VIDEO_PATH)
    count = 0
    while cap.isOpened():
        ret, img = cap.read()
        if ret is not None:
            if img is None:
                continue
            img = imutils.resize(img, width=600)
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            face = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x, y, w, h) in face:
                cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0))
                count += 1
                if not os.path.exists(SAVE_PATH + 'user.' + str(face_id)):
                    os.mkdir(SAVE_PATH + 'user.' + str(face_id))
                cv.imwrite(SAVE_PATH + 'user.' + str(face_id) + "/count_" + str(count) + ".jpg", gray[y: y + h, x: x + w])
            if count >= 800:
                break   
            cv.imshow('h', img)
            key = cv.waitKey(1)
            if key == 27:
                break
        else:
            break
    cap.release()
    cv.destroyAllWindows()
    
    # %%
    import tensorflow.keras as keras
    from keras.preprocessing.image import ImageDataGenerator
    
    train_gen = ImageDataGenerator(rescale= 1./255)
    train_img_gen = train_gen.flow_from_directory('./data/')
    
    # %%
    # 人脸识别器
    import time
    
    
    recog = cv.face.LBPHFaceRecognizer_create()
    recog.read('trainner/face.yaml')
    #创建一个函数,用于从数据集文件夹中获取训练图片,并获取id
    time_start = time.process_time()
    def get_imgs_labels():
        face_id = 0
        face_arr = []
        face_ids = []
        for user_id in os.listdir(SAVE_PATH):
            face_id = user_id.split('.')[1]
            user_path = SAVE_PATH + user_id
            image_paths = [os.path.join(user_path, key) for key in os.listdir(user_path)]
            for path in image_paths:
                face_ids.append(int(face_id))
                img = cv.imread(path, 0)
                # img_arr = np.array(img, dtype="uint8")
                face_arr.append(img)
        return face_arr, face_ids
    
    face_arr, face_ids = get_imgs_labels()
    time_end = time.process_time ()
    print('runTime' + str((time_end - time_start)))
    recog.train(train_img_gen)
    print('train' + str((time.process_time () - time_end)))
    recog.save('trainner/face.yaml')
    
    # %%
    VIDEO_PATH = 'video/hero2.mp4'
    font = cv.FONT_HERSHEY_SIMPLEX
    idNum = 0
    names = ['unknow', 'cc', 'dm']
    cap = cv.VideoCapture(VIDEO_PATH)
    while cap.isOpened():
        ret, img = cap.read()
        img = imutils.resize(img, width=600)
        if ret is not None:
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            face = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x, y, w, h) in face:
                cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0))
                id, conf = recog.predict(gray[y: y+h, x: x+w])
                user = ''
                if conf < 100:
                    user = names[id]
                    conf = "{0}%".format(round(100-conf))
                else:
                    user = "unknown"
                    conf = "{0}%".format(round(100-conf))
                cv.putText(img, user, (x + 5, y - 5), font, 1, (0,255, 0), 1)
                cv.putText(img, str(conf), (x + 50, y - 5), font, 1, (0,255, 0), 1)
            cv.imshow('face', img)
            key = cv.waitKey(1)
            if key == 27:
                break
    cap.release()
    cv.destroyAllWindows()
            
                
            
            
            
    
    # %%
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
  • 相关阅读:
    R包的尽头是 C/C++
    Redis+Caffeine两级缓存,让访问速度纵享丝滑
    【c语言】--qsort快速排序【附模拟实现】
    提升 React 应用的安全性:从这几点入手
    【Java】IDEA 将 Java 项目打包成 Jar 包
    基于Python+tkinter实现一个简易计算器桌面软件
    《golang设计模式》第三部分·行为型模式-04-迭代器模式(Iterator)
    罗克韦尔AB PLC RSLogix5000中计数器指令使用方法介绍
    tomcat高并发下优化详解及连接数和线程池
    【博学谷学习记录】超强总结,用心分享丨大数据超神之路(七):Apache Doris中篇
  • 原文地址:https://blog.csdn.net/monk96/article/details/125944781