首页 > 编程语言 >用OpenCv-Python自带的LBPH识别器实现简单人脸识别(下)

用OpenCv-Python自带的LBPH识别器实现简单人脸识别(下)

时间:2023-04-02 16:23:01浏览次数:35  
标签:人脸识别 img Python LBPH cv2 face path import id

介绍

本文附录了通过LBPH实现简单人脸识别的源代码,分类效果并不是很好,供个人学习使用。

人脸录入.py

import cv2

cap = cv2.VideoCapture(0)

flag = 1
num = 0

while (cap.isOpened()):
    ret_flag, Vshow = cap.read()
    cv2.imshow("Capture_Test", Vshow)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('s'):
        cv2.imwrite("F:/pythonProject/test/Lao_Wang/" + "0.WangZhenHui" + str(num) + ".jpg", Vshow)
#  路径需要自己修改 名称里的id和名字也要自己修改,每个人一个id和一个名字  num表示的每个id所对应的图片的数量
        print("success to save" + str(num) + ".jgp")
        print("----------------------------------")
        num += 1
    elif k == ord(' '):
        break

cap.release()

cv2.destroyAllWindows()

训练数据.py

import os
import cv2
import sys
from PIL import Image
import numpy as np


def getImageAndLabels(path):
    facesSamples = []
    ids = []
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    # 检测人脸
    face_detector = cv2.CascadeClassifier('D:/Python_venv/tf/Lib/site-packages/cv2/data'
                                          '/haarcascade_frontalface_alt2.xml '
                                          )
    # 打印数组imagePaths
    print('数据排列:', imagePaths)
    # 遍历列表中的图片
    for imagePath in imagePaths:
        # 打开图片,黑白化
        PIL_img = 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:
            ids.append(id)
            facesSamples.append(img_numpy[y:y + h, x:x + w])

        print('id:', id)
    print('fs:', facesSamples)

    return facesSamples, ids


if __name__ == '__main__':
    # 图片路径
    path = 'F:/pythonProject/test/Lao_Wang/'
    # 获取图像数组和id标签数组和姓名
    faces, ids = getImageAndLabels(path)
    # 创建LBPH实例对象
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    # 训练模型
    recognizer.train(faces, np.array(ids))
    # 保存数据
    recognizer.write('trainer/trainer.yml')


人脸识别.py

import cv2
import numpy as np
import os
# coding=utf-8
import urllib
import urllib.request
import hashlib

# 加载训练数据集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names = []
warningtime = 0


# 准备识别的图片
def face_detect_demo(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度

    face_detector = cv2.CascadeClassifier('D:/Python_venv/tf/Lib/site-packages/cv2/data'
                                          '/haarcascade_frontalface_alt2.xml ')
    face = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))  # 人脸检测

    for x, y, w, h in face:
        cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
        cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)
        # 人脸识别
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        print('标签id:',ids,'置信评分:', confidence)  # 这里的置信评分其实可以理解为差异值,超过80就代表着差异值过大
        if confidence > 80:
            global warningtime
            warningtime += 1
            if warningtime > 100:
                warningtime = 0
            cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result', img)
# name函数读取特定路径下的名字
def name():
    path = 'F:/pythonProject/test/Lao_Wang/'
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    for imagePath in imagePaths:
        name = str(os.path.split(imagePath)[1].split('.', 2)[1])
        names.append(name)


# cap=cv2.VideoCapture('1.mp4')
cap = cv2.VideoCapture(0)
name()
while True:
    flag, frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break
cv2.destroyAllWindows()
cap.release()
# print(names)

标签:人脸识别,img,Python,LBPH,cv2,face,path,import,id
From: https://www.cnblogs.com/index-12/p/17280693.html

相关文章

  • javascript VS python 变量作用域
    js中函数内部默认是可以读取到外部声明的变量,python不可以,必须使用关键字globalglobal必须在函数内部使用,用以内化函数外部变量。在函数外部是无法声明全局变量的,或者说所谓的全局变量在函数内部是不好使的,这还叫什么全局变量?应该叫局外变量。而global是内部跟局外变量建立一种......
  • 孤狼老师-接口测试自动化(Python版完整版)-日志记录&测试报告
            此时,由于每次执行方法前,都会执行一遍setup,故每次都要初始化一次LoggerHelper方法,每次都会加载一次配置文件,优化LoggerHelper:        针对多个接口用例,使用如下方式:   ......
  • Python使用rtlsdr
    1.打开命令行  也可以在Spyder中的控制台中2.安装rtlsdrpipinstallpyrtlsdr3.下载驱动动态库https://ftp.osmocom.org/binaries/windows/rtl-sdr/因为python是64位的,所以驱动也要下载64位的 下载最新的即可4.这三个就是我们需要的驱动  5.将三个驱动复制......
  • 【Linux Centos】如何卸载自带的python和yum以及卸载后如何重新安装yum
    【LinuxCentos】如何卸载自带的python和yum以及卸载后如何重新安装yum注意如果不是必要情况,请不要卸载服务器自带的python,因为yum等命令都会用到python库,卸载以后可能造成不良后果。如果只是觉得系统python版本不合适,想安装新版本,建议安装anaconda或miniconda,在不同的环境中使......
  • python从入门到实践第16章 下载数据1
    第一步获取csv格式文件需要python爬虫的相关知识 第二步 先打印第一行观察标签importcsvfilename='data/sitka_weather_2014.csv'withopen(filename)asf:reader=csv.reader(f)header_row=next(reader)print(header_row)['AKST','MaxTempe......
  • Python遍历时删除元素问题(附深拷贝与浅拷贝介绍)
    问题有时候,我们希望用Python遍历一个列表(或其他可迭代对象),如果其中有我们不需要的元素就把它删除并继续遍历。如以下代码段,我们本希望打印1、3,可最后却只打印了1。a=[1,2,3]foriina:ifi==2:a.remove(i)else:print(i)分析其实,之所以......
  • python面向对象进阶
    面向对象进阶类型判断issubclasstypeisinstance反射反射的四个函数importlib类的其他成员__str____repr____format____del____dict__和__slots____item__系列__init____new____call____doc____iter__和__next____ente......
  • [oeasy]python0123_中文字符_文字编码_gb2312_激光照排技术_王选
    中文编码GB2312回忆上次内容上次回顾了日韩各有编码格式日本有假名五十音一字节可以勉强放下 有日本汉字字符数量超过20000+  韩国有谚文数量超过500一个字节放不下 有朝鲜汉字字符数量超过20000+......
  • Python异常 ValueError的问题详解
    导读这篇文章主要介绍了Python异常ValueError的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教Python异常ValueErrorValueError:invalidliteralforint()withbase10:'*'试图将一个与数字无关的类型转化为整数,会抛出该异常。......
  • 爬虫简单python小程序
    importrequestsfrombs4importBeautifulSoupbase_url='your_base_url_here'#根据网站的实际URL模式修改此函数defget_page_url(page_number):returnf'{base_url}?page={page_number}'#根据网站的HTML结构,您可能需要修改以下选择器以获取游戏标题defget_g......