建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11
这次我们继续解读代码,我们主要来看下面两个部分;

至于人脸识别成功的要点我们在最后总结~
具体代码学习:
#定义人脸名称
def name():#预学习照片存放位置path = 'M:/python/workspace/PythonProject/face/'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)
(1)os.path.join()协调文件路径中'/' '\'差异
将多个路径组件智能地拼接成一个完整的路径。由于不同操作系统的差异,os.path.join() 可以根据当前操作系统自动处理这些差异。
补充:不同操作系统使用不同的路径分隔符。
Windows 使用反斜杠 \,Unix/Linux 和 macOS 使用正斜杠 /
#举例:
import os# 拼接路径
path = os.path.join('home', 'user', 'documents')
print(path)
- 在 Windows 系统上,输出可能是
home\user\documents。 - 在 Unix/Linux 或 macOS 系统上,输出为
home/user/documents。
(2)os.listdir()输出某目录下所有文件名

即os.listdir(path)获得了['1.lss.jpg', '2.lss.jpg']
os.path.join()将路径M:\python\workspace\PythonProject\face替换为
M:/python/workspace/PythonProject/face/1.lss.jpg
M:/python/workspace/PythonProject/face/2.lss.jpg

os.path.join(path, f)这里path是前面指定的目录路径,f是os.listdir(path)返回列表中的每个元素(即文件或文件夹名称)。- 代码比较长,我们来看一下这个循环的内容:

这行代码遍历 os.listdir(path) 返回的列表,对每个文件名 调用 os.path.join(path, f) 进行路径拼接,最终将所有拼接好的完整路径组成一个新的列表。
我们可以把整段代码的阅读顺序做如下表达:

让我们继续解读:
for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.',2)[1])names.append(name)
for imagePath in imagePaths是在刚形成的imagePath列表里自己进行循环
(3)os.path.split()将一个文件路径拆分为目录部分和文件名部分。
- 通过上一个代码我们获取了imagePath=M:/python/workspace/PythonProject/face/1.lss.jpg
- os.path.split(imagePath)就是把M:/python/workspace/PythonProject/face/1.lss.jpg拆为:
- 文件目录M:/python/workspace/PythonProject/face/
- 文件名1.lss.jpg
os.path.split(imagePath)[1]是从文件目录和文件名中获取第二个文件名,即1.lss.jpg
补充:这里的第二个元素是因为列表、元组和字符串的索引都是从 0 开始,即[0]代表首位,[1]代表第二个,以此类推。
(4)split() 将字符串按照指定的分隔符分割成多个子字符串,并返回一个包含这些子字符串的列表
str.split(sep=None, maxsplit=-1)
sep:可选参数,指定分隔符。如果不提供该参数,默认使用空白字符(空格、制表符、换行符等)作为分隔符。maxsplit:可选参数,指定最大分割次数。如果不提供该参数,表示不限制分割次数。
-
split('.', 2)的含义就是分隔符为 . 最多分隔2次。 -
对
'1.lss.jpg'调用split( )后,会得到列表['1', 'lss', 'jpg']。 -
split('.',2)[1]这里从文件名1.lss.jpg中取出第二个元素,即lss
整行代码解读为:

(5)append()在列表的末尾添加一个新元素
list.append(object)
list:表示要操作的列表对象。object:表示要添加到列表末尾的任意 Python 对象,比如字符串、整数、列表、元组等。
names.append(name)这里就是把开头创建的names列表填进了内容name
解读主函数:
内容我们都学过,就直接标注了
#打开视频test3.mp4读取每一帧
cap=cv2.VideoCapture('test3.mp4')
#调用自定义name函数
name()
while True:#读取视频里的帧flag,frame=cap.read()#如果没有帧则中断if not flag:break#调用自定义face_detect_demo函数,进行人脸识别和标注face_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break
(5)全部代码解读为:
import cv2
#导入与操作系统交互 os 模块
import os#创建一个 LBPH(局部二值模式直方图)人脸识别器对象,用于训练和识别人脸。
recogizer=cv2.face.LBPHFaceRecognizer_create()
#读取训练好的人脸识别模型yml文件
recogizer.read('M:/python/workspace/PythonProject/trainer/trainer.yml')
#初始化一个空列表names,用于存储人脸对应的名称。
names=[]
#初始化一个全局变量warningtime,用于记录未知人脸出现的次数。
warningtime = 1#自定义人脸识别
def face_detect_demo(img):#彩图转化为灰图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#调用人脸识别分类器face_detector=cv2.CascadeClassifier('M:/python/pythoninstall/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml')#灰图中检测人脸face=face_detector.detectMultiScale(gray)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,置信度confidenceids, confidence = recogizer.predict(gray[y:y + h, x:x + w])#如果置信度confidence>80if confidence > 80:#warningtime作为全局变量global warningtime#每次出现都+1warningtime += 1#控制台输出warningtime=,值为warningtimeprint('warningtime=',warningtime)#图像上绘制文本,文本是unknown,位置是x向右偏移10个像素。y向上偏移10个像素,字体无衬线,字体大小0.75,绿色cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:#图像上绘制文本,文本是names列表中的,其余同上#坐标移动规律:+ 号撒腿右下跑,- 号转身左上飘cv2.putText(img,str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)#弹出窗口名为resultcv2.imshow('result',img)#定义人脸名称
def name():#预学习照片存放位置path = 'M:/python/workspace/PythonProject/face/'#获取path路径下文件名,将文件名+路径拼接完整路径,将完整路径存到imagePaths中imagePaths=[os.path.join(path,f) for f in os.listdir(path)]for imagePath in imagePaths:#获取文件名中的一部分作为name,即name=lssname = str(os.path.split(imagePath)[1].split('.',2)[1])#将提取出的人脸名称 name 添加到 names 列表中names.append(name)#打开视频test3.mp4读取每一帧
cap=cv2.VideoCapture('test3.mp4')
#调用自定义name函数
name()
while True:#读取视频里的帧flag,frame=cap.read()#如果没有帧则中断if not flag:break#调用自定义face_detect_demo函数,进行人脸识别和标注face_detect_demo(frame)if ord(' ') == cv2.waitKey(10):breakcv2.destroyAllWindows()
cap.release()
print(names)
(6)人脸识别成功的要点
本次识别我们用两张人像即实现了人脸识别,这有赖于LBPH分类器的局部特征特性,少量图片即可识别。同时在素材选择中刻意选择了差异较大的人物,且目标人像的角度基本一致而检测任务则为其他角度。如果想提升识别准确性目前我所了解的一个是提升训练样本量,更改分类器或者用其他方式进行识别。在实验中我尝试了用130多张图用LBPH分类器,但训练效果不佳。所以目前的成果对于材料的选择有较高的要求。
(7)补充[]和()的区别
- 方括号
[]用于表示列表(list)。列表是一种可变的、有序的数据集合,列表支持元素的添加、删除、修改等操作 - 方括号
[]用于索引和切片操作
my_list = [1, 'apple', True]my_list = [1, 2, 3, 4, 5]
# 索引操作,获取第一个元素
first_element = my_list[0]# 切片操作,获取第 2 到第 4 个元素
sub_list = my_list[1:4]
print(sub_list) # 输出: [2, 3, 4]my_tuple = (1, 2, 3, 4, 5)
# 元组的索引操作
first_tuple_element = my_tuple[0]
print(first_tuple_element) # 输出: 1squares = [i**2 for i in range(1, 6)]
- 圆括号
()用于表示元组(tuple)。元组是一种不可变的、有序的数据集合,一旦创建就不能修改其元素 - 圆括号
()用于函数调用。调用函数时,需要使用圆括号将参数括起来。如果函数不需要参数,也需要使用空的圆括号。
my_tuple = (1, 'apple', True)def greet(name):def say_hi():
综上大部分情况都使用圆括号()
(8)总结
- os.path.join()协调文件路径中/\差异
- os.listdir()输出某目录下所有文件名
- os.path.split()将一个文件路径拆分为目录部分和文件名部分
split()将字符串按照指定的分隔符分割成多个子字符串,并返回一个包含这些子字符串的列表append()在列表的末尾添加一个新元素
相关文章:
建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11
这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…...
在使用export default 导出时,使用的components属性的作用?
文章目录 析与思考回答 析与思考 在 Vue.js 中,使用 export default 导出组件时,通常会通过 components 选项将子组件也导出出来(其实是将子组件进行局部注册) 。这涉及到 Vue.js 组件的注册机制。为了更清晰地理解这个问题&…...
以太网交换基础(涵盖二层转发原理和MAC表的学习)
在当今的网络世界中,以太网交换技术是局域网(LAN)的核心组成部分。无论是企业网络、学校网络还是家庭网络,以太网交换机都扮演着至关重要的角色。本文将详细介绍以太网交换的基础知识,包括以太网协议、帧格式、MAC地址…...
Vue 实现通过URL浏览器本地下载 PDF 和 图片
1、代码实现如下: 根据自己场景判断 PDF 和 图片,下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…...
【2025最新计算机毕业设计】基于SpringBoot+Vue非遗传承与保护研究系统【提供源码+答辩PPT+文档+项目部署】
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
组合总和力扣--39
目录 题目 思路 剪枝优化 代码 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的…...
echarts tooltip高亮某个值,某一项选中高亮状态
需求: 当有多组数据的时候,常常需要对比同一x轴的不同线上的点的数据,并且当数据组过多的时候,也就是线过多的时候,需要明确知道我们当前选中的线是哪条。 解决方案: 通过设置显示x轴的tooltip可以显示同…...
Vue 3:基于按钮切换动态图片展示(附Demo)
目录 前言1. Demo2. 升级Demo3. 终极Demo 前言 原先写过类似的知识点: 详细分析el-breadcrumb 面包屑的基本知识(附Demo)详细分析el-card中的基本知识(附Demo) 本篇博客将介绍如何通过点击按钮切换不同的图片&#…...
【Java】泛型与集合篇 —— 泛型
目录 泛型泛型的核心作用泛型类型(类)定义与使用类型参数命名约定泛型方法定义与调用与泛型类的区别通配符上界通配符下界通配符有界类型参数类型擦除类型擦除过程影响好处泛型 泛型的核心作用 泛型是 Java 实现代码复用和类型安全的重要机制。它允许在类、接口和方法中定义…...
【JAVA:list中再定义一个list对象,循环赋值不同的list数据,出现追加重复数据问题】
问题描述: list中再定义一个list对象,循环赋值不同的list数据,结果全部都累加到每条数据中了,每条数据中都出现重复数据。 问题解决: 1.创建树结构方法信息 2.创建一个新的 List 对象,避免引用问题 3.使…...
为什么外贸办公需要跨境专线网络?
你好,今天我们来聊聊SD-WAN技术在出海企业办公中的应用以及其带来的诸多优势。当今出海企业在与海外分支机构或合作伙伴开展高效的网络通讯和数据传输时,面临着许多挑战。此时,SD-WAN作为一种新兴的网络优化技术,正在改变这些企业…...
帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]
FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…...
Nginx 在Linux中安装、使用
Nginx 在Linux中安装、使用 一、官网下载Nginx 官网地址:http://nginx.org/en/download.html 二、上传到服务器解压 1、上传到指定的服务器地址 上传的地址自己决定,我上传到 /data/home/prod/nginx/ 2、解压 使用命令: tar -zxvf “你的N…...
在Vue项目中使用three.js在前端页面展示PLY文件或STL文件
前言:这是一个3d打印局域网管理系统的需求 一、安装three.js three.js官网:https://threejs.org/docs/#manual/en/introduction/Installation 我用的是yarn,官网用的是npm 二、使用three.js 1.在script部分导入three.js import * as THREE from thr…...
DeepSeek笔记(二):DeepSeek局域网访问
如果有多台电脑,可以通过远程访问,实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中,首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11,…...
【LeetCode Hot100 矩阵】矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵II
矩阵 1. 矩阵置零(Set Matrix Zeroes)解题思路步骤: 代码实现 2. 螺旋矩阵(Spiral Matrix)解题思路具体步骤: 代码实现 3. 旋转矩阵 90 度解决思路代码实现 5. 搜索二维矩阵中的目标值解决思路代码实现 1. …...
【设计模式】【创建型模式】建造者模式(Builder)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
如何利用国内镜像从huggingface上下载项目
1、利用镜像快速下载项目 在huggingface上下载模型时速度太慢,可以用下面的方法 pip install -U huggingface_hub pip install huggingface-cliexport HF_ENDPOINThttps://hf-mirror.comhuggingface-cli download --resume-download shenzhi-wang/Llama3-8B-Chine…...
pandas常用操作
pandas是Python中用于数据操作和分析的强大库。以下是一些常用的操作: ### 1. 读取数据 - **从CSV文件读取**: python import pandas as pd df pd.read_csv(path/to/file.csv) - **从Excel文件读取**: python df pd.read_exc…...
linux使用
文章目录 前言操作系统的作用组成二、安装linux系统安装VMware Workstation安装ubuntu图形化,命令行finalshell快照目录理解命令执行命令格式常用命令lscdmkdir 前言 本文讲解认识与使用linux操作系统 操作系统的作用 操作系统是用户和计算机的桥梁。比如我们输入…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
中国政务数据安全建设细化及市场需求分析
(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...
