基于opencv的人脸识别(实战)

news2024/11/16 16:35:19

前言

经过这几天的学习,我已经跃跃欲试了,相信大家也是,所以我决定自己做一个人脸识别程序。我会把自己的思路和想法都在这篇博客内讲清楚,大家可以当个参考,🌟仅供学习使用🌟。

🌟在文章顶部,我给出打包的exe文件,不管你的电脑是否有python都可以运行人脸识别应用程序,我在这里打包了文件,后续有空会更新代码,给出功能更完善的程序应用,大家图个乐吧~

🌟这里提供本文代码打包的exe文件的蓝奏云,这个后续是不会更新的:人脸识别系统 密码是:551x

⚠️本博客的所有内容只供学习,不可用于其他用途,目前拒绝转载!!!

流程

  • 前言
    • 前期准备
    • 添加人脸数据集
    • 人脸识别功能
    • 人脸检测
    • 成果展示
    • 补充:如何用手机作为摄像头
    • 小结

前期准备

在开始之前,我们先构想一个基本框架:

  1. 我们需要一个数据库来存储人物照片。
  2. 我们需要使用一种人脸识别器来进行人脸识别训练,这里我选用Fisherfaces人脸识别器。
  3. 既然已经可以识别人脸了,我们需要检测人脸,haarcascade_frontalface_default.xml是检测正面人脸的级联分类器文件,加载该文件我们就可以创建出追踪正面人脸的分类器了。

根据这些思路,我创建了以下文件架构:

face
└── cascades # 用来存放opencv的xml文件
    ├── face_db # 用来存放人脸数据集
    └── lib # 用来存放功能函数
    └── main.py # 主函数

添加人脸数据集

在face_db文件夹添加你要识别的人的文件,例如你有十张杨幂的人脸图片,你在face_db文件夹中添加一个文件夹:yangmi,将十张杨幂的人脸图片放入文件夹内,例如我这样:
在这里插入图片描述

这是我放了两个人的人脸的数据,这里要注意两点:

  1. 首先就是数据最少都要两个人的数据
  2. 其次就是如果你进行人脸检测的摄像头是电脑的你就用电脑的相机拍照,如果检测时用手机摄像头就用手机摄像头拍照

人脸识别功能

我们有了数据集就可以创建特征脸识别器进行训练了。这里我们在lib文件夹内添加功能函数模块,目前我只添加了人脸识别功能,在lib内创建函数face_recognition.py。

废话不多说,直接上代码:

# face_recognition.py
import cv2,os
import numpy as np

photos = list()  # 样本图像列表
lables = list()  # 标签列表
target_size = (100, 200)  # 设置统一的图像尺寸

# ⚠️listdir要求绝对路径,换成你们自己的
for filename in os.listdir(r'C:\Users\lyh20\PycharmProjects\face\face_db\lyh'):
    file_path = os.path.join(r'C:\Users\lyh20\PycharmProjects\face\face_db\lyh', filename)
    # 检查是否为文件
    if os.path.isfile(file_path):
        # 读取图像并添加到photos列表
        photo = cv2.imread(file_path,0)
        # ⚠️识别器要求图片尺寸要相同,所以统一尺寸
        photo = cv2.resize(photo,target_size)
        if photo is not None:  # 确保图像被正确读取
            photos.append(photo)
            lables.append(0)

for filename in os.listdir(r'C:\Users\lyh20\PycharmProjects\face\face_db\zch'):
    file_path = os.path.join(r'C:\Users\lyh20\PycharmProjects\face\face_db\zch', filename)
    # 检查是否为文件
    if os.path.isfile(file_path):
        # 读取图像并添加到photos列表
        photo = cv2.imread(file_path,0)
        photo = cv2.resize(photo, target_size)
        if photo is not None:  # 确保图像被正确读取
            photos.append(photo)
            lables.append(1)


names = {"0": "lyh","1":"zch"}  # 标签对应的名称字典,如果有更多的人物,就按照这个格式添加

def recognitionface(img):
'''
img:图像数据
'''
    recognizer = cv2.face.FisherFaceRecognizer_create()  # 创建特征脸识别器
    recognizer.train(photos, np.array(lables))  # 识别器开始训练

    i = cv2.resize(img,target_size)
    i = cv2.cvtColor(i,cv2.COLOR_RGB2GRAY)
    label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
    return names[str(label)]

🌟代码写的很详细了,如果还有不懂的评论区见咯。

lib文件夹内就是存储功能函数的,我目前只添加了这个功能。

人脸检测

我们已经有了识别人脸的函数了,那我们现在就需要打开摄像头检测到人脸,然后调用识别人脸函数来识别人脸是谁了并在视频中显示。

废话不多说,上代码:

# main.py
import cv2
from lib.face_recognition import recognitionface # 从lib中调用人脸识别函数
capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, img = capture.read() # 从摄像头中实时读取视频
    faceCascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml") # 调用正面人脸级联分类器
    faces = faceCascade.detectMultiScale(img, 1.3)  # 检测出所有人脸
    for (x, y, w, h) in faces:  # 遍历所有人脸的区域
        faces_sql = recognitionface(img) # 获取人脸信息,对人脸进行识别
        cv2.putText(img, faces_sql, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3) # 在视频中展示人脸信息
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 在图像中人脸的位置绘制方框
    cv2.imshow("Video", img) # 在窗口中显示读取到的视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下esc键,退出进程
        break
capture.release() # 关闭笔记本内置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

🌟这个代码比较简陋,对很多可能的报错和人脸的匹配度都没有处理方案,但是学习完全够了,大家可以看看,可以在评论区交流。

成果展示

在这里浅浅地展示一下吧,这里加了代码做了遮挡处理哈哈哈:
请添加图片描述

识别没错,是我本人。代码还有很多需要修缮的地方,但是核心都做到啦!

补充:如何用手机作为摄像头

这里我用的是DroidCamApp软件,可以将手机摄像头作为电脑摄像头,我在这提供下载路径:

  1. 电脑端链接: droidcam电脑端
  2. 安卓的得在谷歌商店下载,所以我这里提供安卓端安装包: droidcam安卓端 密码是:50s1

软件的用法自行百度吧,很简单。

🌟当你成功用这个软件将手机作为摄像头之后,你需要修改一部分代码:

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头

你需要修改为:

capture = cv2.VideoCapture(1) # 1,表示外置摄像头

小结

因为代码比较简单,所以用到的知识点不多,我在这里@出这个项目中涉及到的:
@ 苦学Opencv的第十四天:人脸检测和人脸识别

@ 苦学Opencv的第五天:绘制图形与文字

@ 苦学Opencv的第十三天:视频处理

大家可以根据之前的学习日记完善代码。

🌟注意这只是一个学习代码,功能少且缺少报错处理,只能用于学习使用。如果不满意可以添加完善代码,大佬勿喷勿喷哈哈哈😂

❤️本专栏到这也就结束了,专栏不对或者不完善的地方后续会更新纠正。

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

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

相关文章

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day5 全网最快最全

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会…

树莓派_Opencv学习笔记23:模版样本匹配

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1: ​ Python 版本3.7.3: 今日学习Opencv样本…

香烟商品销售网站

1 香烟商品销售网站概述 1.1 课题简介 1.2 设计目的 1.3 系统开发所采用的技术 1.4 系统功能模块 2 数据库设计 2.1 建立的数据库名称 2.2 所使用的表 3 香烟商品销售网站设计与实现 1. 注册登录: 2. 分页查询: 3. 分页条件(精确、…

速卖通卖家如何利用自养号测评,让店铺曝光量飙升?

在速卖通这个竞争激烈的跨境电商平台上,店铺曝光率是决定销售成败的关键因素之一。为了在众多商家中脱颖而出,增加速卖通店铺曝光显得尤为重要。速卖通怎么增加店铺曝光? 速卖通怎么增加店铺曝光? 1、优化产品列表 速卖通的产品列表是买家…

数据库实验:连接查询

一、实验目的: 1、掌握使用两种写法完成连接查询:叉积连接语法和内连接语法。 2、掌握使用外连接语法完成查询。 3、掌握使用派生表完成下列查询。 二、实验内容: 1. 使用连接实现查询,查询订单号为‘000005’的订单订购的玩具…

windows 安装docker桌面版

下载 下载两个: git桌面版 docker desktop 启动docker 执行安装文件,启动 更新wsl2 假如报错,会提示失败原因。 win10会提示跳转到: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-l…

CANoe编程实例--TCP/IP通信

1、简介 本实例将使用目前常用的开发工具C#来开发服务器端,以CANoe端作为客户端。服务器端和客户端,通过TCP/IP连接,实现数据交换。 首先在服务器端建立一个监听Socket,自动创建一个监听线程,随时监听是否有客户端的连…

使用 Visual Studio 2022 自带的 cl.exe 编译 tensorRT自带测试样例 sampleOnnxMNIST

1. 新建任意文件夹,将 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sampleOnnxMNIST.cpp 文件复制进来,同时 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sample_onnx_mnist.vcxproj 中的内容&…

WEBKIT 通过JavaScript 调用本地,硬件未来之窗OS硬件APP

以酒店为例我们需要调用shen份证读取,采集人脸,门锁写房卡,如何通过浏览器调用 1.通过本地http服务 2.通过webkit模式 这里说政务单位模式的集成 由于篇幅问题,怎么集成webkit就不说了 一、webkkit加载交互本地代码 browser.…

【Kettle实现神通(数据库)MPP增量、全量数据ETL,同步任务Linux运行(通用)】

1、背景介绍 具体Kettle操作步骤不做过多介绍,主要技术方案说明,Kettle8.2版本放在底部链接提取,本次采用Kettle实现源端:神通数据通用库、目标端:神通MPP增量数据同步,并在服务器端运行Job。 2、windows…

Materials Today|用于婴儿监护的柔性电子设备 (柔性健康监测/柔性传感/可穿戴电子/电子皮肤/柔性电子)

西安交通大学方云生(Yunsheng Fang)、徐峰(Feng Xu)和西安交通大学第一附属医院林婷(Ting Lin)团队,在期刊《Materials Today》上发布了一篇题为“Soft electronics for advanced infant monito…

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注:另一种方式参考 关于TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前,我们可以先了解一下什么是序列化与反序列…

JAVA里的配置文件(Properties)详解

package Properties;import java.util.Map; import java.util.Properties; import java.util.Set;public class demo1 {public static void main(String[] args) {/*Properties作为Map集合的操作*///1.创建集合的对象Properties pnew Properties();//2.添加数据//细节&#xff…

谷粒商城实战笔记-79-商品服务-API-平台属性-销售属性维护

文章目录 一,列表接口开发1,新建常量类2,路径参数识别规格参数和销售属性 二,其他接口三,编码经验-使用常量类为什么要用常量类?示例 这一节的主要内容是: 销售属性列表查询接口的开发将代码中的…

C++ 沙漏图案(Hour-glass Pattern)

给定正整数 n,以沙漏形式打印数字模式。示例: 输入:rows_no 7 输出: 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 6 7 5 6 7 4 5 6 7 3 4 5 6 7 2 3 4 5 6 7 1 2 3 4 5 6…

等保2.0测评 — 容器测评对象选取

之前有小伙伴提问到,关于容器到底要测评哪些内容,也就是测评对象的选取。 首先要区分的是容器与容器集群这两个概念。容器集群概念可参考该篇文章。 不使用容器扩展要求情况 当仅使用容器技术时,采用安全通用要求,无需使用容器…

AFSim仿真系统-架构概览

引言 本文档从最终用户的角度描述了AFSIM架构,旨在帮助最终用户深入了解AFSIM的操作概念。 核心架构 AFSIM基于面向对象的C架构,提供了一种可扩展和模块化的架构,使得许多附加功能能够轻松集成。AFSIM允许新的组件模型(如传感器、…

2019数字经济公测大赛-VMware逃逸

文章目录 环境搭建漏洞点exp 环境搭建 ubuntu :18.04.01vmware: VMware-Workstation-Full-15.5.0-14665864.x86_64.bundle 这里环境搭不成功。。patch过后就报错,不知道咋搞 发现可能是IDA加载后的patch似乎不行对原来的patch可能有影响,重新下了patch&…

LiteFlow条件组件的设计组件标签|组件参数,EL与或非表达式正反解析,元数据管理

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 参考 https://juejin.cn/post/7005869798483558431 🍉组件参数 | LiteFlow &#x1f34…

黑龙江等保测评如何做到既全面又高效?

在黑龙江省进行等保测评,必须在全面和高效之间寻求一个平衡点,以保证网络的安全性和可靠性。黑龙江等保测评怎样才能在二者之间发现黄金交汇点?下面,我们来揭开谜底。 精准定位,明确测评范围 首先,一个综…