Python的人脸识别程序

news2024/9/20 9:20:27

1.录入人脸,输入ID号

haarcascade_frontalface_default.xml

#  导入模块
import os
import numpy as np
import cv2 as cv
import cv2

face_detector = cv2.CascadeClassifier(r'D:\Automation_All_Files\OCR\haarcascade_frontalface_default.xml') # 待更改

# 为即将录入的脸标记一个id

face_id = input(r'Userdatainput, Look at the camera and wait …')

# sampleNum用来计数样本数目

count = 0
while True:
    #从摄像头读取图片
    cap = cv2.VideoCapture(0)
    success,img = cap.read()
    print(f'success is:{success}')
    print(f'img is :{img}')

    #转为灰度图片,减少程序符合,提高识别度

    if success is True:

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    else:

        break

    #检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸

    #其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors

    faces = face_detector.detectMultiScale(gray, 1.3, 5)



    #框选人脸,for循环保证一个能检测的实时动态视频流

    for (x, y, w, h) in faces:

        #xy为左上角的坐标,w为宽,h为高,用rectangle为人脸标记画框

        cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))

        #成功框选则样本数增加

        count += 1

        #保存图像,把灰度图片看成二维数组来检测人脸区域qw

        #(这里是建立了data的文件夹,当然也可以设置为其他路径或者调用数据库)

        cv2.imwrite("data/User."+str(face_id)+'.'+str(count)+'.jpg',gray[y:y+h,x:x+w])

        #显示图片

        cv2.imshow('image',img)

        #保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像

    k = cv2.waitKey(1)

    if k == '27':

        break

        #或者得到800个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后800张的效果是比较理想的

    elif count >= 10:

        break

2.训练:

#encoding=utf-8

import os

import cv2

import numpy as np

from PIL import Image

# 导入pillow库,用于处理图像

# 设置之前收集好的数据文件路径

path = r'D:\Automation_All_Files\OCR\data'

# 初始化识别的方法

recog = cv2.face.LBPHFaceRecognizer_create()

# 调用熟悉的人脸分类器

detector = cv2.CascadeClassifier(r'D:\Automation_All_Files\OCR\haarcascade_frontalface_default.xml')

# 创建一个函数,用于从数据集文件夹中获取训练图片,并获取id

# 注意图片的命名格式为User.id.sampleNum

def get_images_and_labels(path):



    image_paths = [os.path.join(path,f) for f in os.listdir(path)]
    print(image_paths)

    #新建连个list用于存放

    face_samples = []

    ids = []



    #遍历图片路径,导入图片和id添加到list中

    for image_path in image_paths:



        #通过图片路径将其转换为灰度图片

        img = Image.open(image_path).convert('L')



        #将图片转化为数组

        img_np = np.array(img,'uint8')
        print(f'os.path.split(image_path)[-1] is:{os.path.split(image_path)[-1]}')


        if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':

            continue



        #为了获取id,将图片和路径分裂并获取

        id = int(os.path.split(image_path)[-1].split(".")[1])

        faces = detector.detectMultiScale(img_np)



        #将获取的图片和id添加到list中

        for(x,y,w,h) in faces:

            face_samples.append(img_np[y:y+h,x:x+w])

            ids.append(id)


    print( face_samples,ids)
    return face_samples,ids


# 调用函数并将数据喂给识别器训练

print(r'Training…')

faces, ids = get_images_and_labels(path)

# 训练模型

recog.train(faces, np.array(ids))

# 保存模型

recog.save(r'trainner.yml')

3.根据曾经录入的人脸和训练模型,确定当前的camera前的是谁。

# -----检测、校验并输出结果-----

import cv2

# 准备好识别方法

recognizer = cv2.face.LBPHFaceRecognizer_create()

# 使用之前训练好的模型

recognizer.read(r'trainner.yml')

# 再次调用人脸分类器

cascade_path = r'D:\Automation_All_Files\OCR\haarcascade_frontalface_default.xml'

face_cascade = cv2.CascadeClassifier(cascade_path)

# 加载一个字体,用于识别后,在图片上标注出对象的名字

font = cv2.FONT_HERSHEY_SIMPLEX

idnum = 0

# 设置好与ID号码对应的用户名,如下,如0对应的就是初始

names = ['original', 'girl', 'minglan', 'me', 'rulan']

# 调用摄像头

cam = cv2.VideoCapture(0)

minW = 0.1 * cam.get(3)

minH = 0.1 * cam.get(4)

while True:
    ret, img = cam.read()

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 识别人脸

    faces = face_cascade.detectMultiScale(

        gray,

        scaleFactor=1.2,

        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])

        # 计算出一个检验结果

        if confidence < 100:

            idum = names[idnum]

            confidence = "{0}%", format(round(100 - confidence))

        else:

            idum = "unknown"

            confidence = "{0}%", format(round(100 - confidence))

        # 输出检验结果以及用户名

        cv2.putText(img, str(idum), (x + 5, y - 5), font, 1, (0, 0, 255), 1)

        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)

        # 展示结果

        cv2.imshow('camera', img)

        k = cv2.waitKey(20)

        if k == 27:
            break

完成后运行将在左上角显示人名(输入的ID号和)

参考:Python的人脸识别设计史上最全的教程,手把手教(附源代码)_人脸识别代码-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VTKExamples::Movie】制作并保存动画

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK中创建动画,并保存动画的方法,样例及样例源码,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…

【Go系列】Go的UI框架GIO

其实主要我是要花一个折线图&#xff0c;但是使用Fyne貌似画不出来&#xff0c;使用plot也没法动态生成&#xff0c;听说Gio可以&#xff0c;那就先介绍一下什么是Gio把。 GIO&#xff08;gioui.org&#xff09;是一个用于Go语言的跨平台GUI库&#xff0c;旨在为开发人员提供构…

【ROS2】高级:安全-设置安全性

目标&#xff1a;使用 sros2 设置安全性。 教程级别&#xff1a;高级 时间&#xff1a;15 分钟 内容 背景 安装 从源代码安装选择替代中间件 运行演示 1. 为安全文件创建一个文件夹2. 生成密钥库3. 生成密钥和证书4. 配置环境变量5. 运行 talker/listener 演示 参加测验&#x…

一起搭WPF界面之MVVM架构的简单搭建

一起搭WPF界面之MVVM架构的简单搭建 1 前言2 创建项目2.1新建项目2.2WPF2.3创建完成 3 MVVM划分3.1 划分逻辑3.2文件夹创建3.3文件创建3.3.1 Views——可在主界面的基础上&#xff0c;划分多个用户控件模块3.3.2 ViewModels——创建数据结构存放的cs文件3.3.3 Models——创建处…

在 VM 虚拟机中安装 openEuler + 桌面

在 VM 虚拟机中安装 openEuler 1 介绍2 步骤语言Root 账户安装位置网络和主机名自动检索到【推荐】手动配置网络 软件选择安装完成登录测试网络curl ip / ping ipip link show / ip a如网络不通&#xff0c;可检查网卡状态和dns配置 安装命令设置以图形界面的方式启动【dde】第…

sql-libs通关详解

1-4关 1.第一关 我们输入?id1 看回显&#xff0c;通过回显来判断是否存在注入&#xff0c;以及用什么方式进行注入&#xff0c;直接上图 可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显&#xff0c;所以我们可以使用联合查询。联合查询原理简单说一下&…

PyTorch之ResNet101模型与示例

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 ResNet101模型 ResNet101是一种深度残差网络&#xff0c;它是ResNet系列中的一种&#xff0c;下面详解ResNet101网络结构。 ResNet101网络结构中有101层&#xff0c;其中第一层是77的卷积层&#xff0c;然后是4个…

Nacos 配置中心配置加载源码分析

前言&#xff1a;上一篇我们分析 Nacos 配置中心服务端源码的时候&#xff0c;多次看到有去读取本地配置文件&#xff0c;那本地配置文件是何时加载的&#xff1f;本篇我们来进行详细分析。 Nacos 系列文章传送门&#xff1a; Nacos 初步认识和 Nacos 部署细节 Nacos 配置管…

https改造-python https 改造

文章目录 前言https改造-python https 改造1.1. https 配置信任库2. 客户端带证书https发送,、服务端关闭主机、ip验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每…

遗传算法与深度学习实战——进化深度学习

遗传算法与深度学习实战——进化深度学习 0. 前言1. 进化深度学习1.1 进化深度学习简介1.2 进化计算简介 2. 进化深度学习应用场景3. 深度学习优化3.1 优化网络体系结构 4. 通过自动机器学习进行优化4.1 自动机器学习简介4.2 AutoML 工具 5. 进化深度学习应用5.1 模型选择&…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考&#xff08;含测试数据&#xff09; 在Java中&#xff0c;要从给定的数据集合中随机选择一个元素&#xff0c;我们很容易想到可以使用 java.…

【Stable Diffusion】(基础篇四)—— 模型

模型 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何下载和使…

C++【泛型编程】【string类常用接口】学习

目录 泛型编程 推演实例化 显示实例化 类模板 类模板的声明和定义分离 STL string string的构造和拷贝构造 选取特定字符串拷贝 解析&#xff1a; 关于npos的解析 验证 从一个字符串中拷贝前几个字符 解析&#xff1a; 注意&#xff1a; 验证&#xff1a; size…

AI应用行业落地100例 | 移民公司Envoy Global引入AI员工赋能,效率飙升80%,开启服务新篇章

《AI应用行业落地100例》专题汇集了人工智能技术在金融、医疗、教育、制造等多个关键行业中的100个实际应用案例&#xff0c;深入剖析了AI如何助力行业创新、提升效率&#xff0c;并预测了技术发展趋势&#xff0c;旨在为行业决策者和创新者提供宝贵的洞察和启发。 Envoy Globa…

Pytorch使用教学2-Tensor的维度

在PyTorch使用的过程中&#xff0c;维度转换一定少不了。而PyTorch中有多种维度形变的方法&#xff0c;我们该在什么场景下使用什么方法呢&#xff1f; 本小节我们使用的张量如下&#xff1a; # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …

【Unity PC端打包exe封装一个并添加安装引导】

Unity PC端打包exe封装一个并添加安装引导 比特虫在线制作ico图标ico图标转换工具 选中打包出来的所有文件和ico图标 右键 使用RAR软件 添加到压缩文件 两个名称要相同 设置完点击确认等待压缩完成 然后就可以使用 Smart Install Maker制作引导安装程序了

Matlab进阶绘图第64期—三维分组针状图

三维分组针状图可以看作是三维分组散点图的升级&#xff0c;能够直观地展示各组分、各元素的位置、对比情况。 由于Matlab中未收录三维分组针状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的groupedstem3小工具进行三维分组针状图的绘制&#xff0c;先…

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…