当前位置: 首页 > news >正文

人脸识别【python-基于OpenCV】

1. 导入并显示图片

#导入模块
import cv2 as cv#读取图片
img=cv.imread('img/wx(1).jpg')  #路径名为全英文,出现中文 图片加载失败,"D:\picture\wx.jpg"
#显示图片  (显示标题,显示图片对象)
cv.imshow('read_picture',img)#等待键盘输入(毫秒单位) 值为0 :表示无限等待
cv.waitKey(0)#释放内存 opencv底层由C++ 编写
cv.destroyAllWindows()

2. 将图片进行灰度处理

import cv2 as cv  #以cv 引用 cv2
img=cv.imread('img/wx(1).jpg')
cv.imshow('BGR_img',img)  #展示该图片
#等待键盘获取时间,该时间内得到键盘响应则继续向下执行;否则展示图片计时结束后自动运行
cv.waitKey(3000)#将 img对象灰度处理后,赋予gray_img对象
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray_img',gray_img)  #展示灰度图片
#保存转换后的图片 (’新文件名‘,原图片对象)
cv.imwrite('img/gray_wx(1).jpg', gray_img)
cv.waitKey(3000)
cv.destroyAllWindows()  #释放内存

3. 更改图片的尺寸大小

import cv2 as cv
img=cv.imread('img/wx(1).jpg')
cv.imshow('old_img',img)
print('原图尺寸为(宽、高、):',img.shape)
cv.waitKey(5000)#改变原始图片尺寸大小
resize_img=cv.resize(img,dsize=(500,500))
print('当前图片尺寸(宽、高、):',resize_img.shape)
cv.imshow('resize_img',resize_img)#更改waitKey等待条件 : 键盘输入 'q'
while 1:if ord(' ')==cv.waitKey(0):breakcv.destroyAllWindows()

4. 在图片中绘制图形

import cv2 as cv
img=cv.imread('img/wx(1).jpg')
img2=cv.imread('img/wx(1).jpg')
#矩形描点:左上角坐标(x,y),右下角坐标(x+w,y+h),w:宽,h:高
x,y,w,h=100,100,40,40
#绘制矩形 (图片对象,坐标(),颜色(),宽度)
cv.rectangle(img,(x,y,x+w,y+h),color=(0,255,0),thickness=2)  #color(BGR)
cv.imshow('rectangle_img',img)
cv.waitKey(2000)#绘制圆形:(原点坐标(),半径,颜色,宽度)
cv.circle(img2,center=(100,100),radius=40,color=(0,0,255),thickness=2)
cv.imshow('circle_img',img2)
cv.waitKey(2000)
cv.destroyAllWindows()

5. 对图片进行人脸检测,对应面部区域绘制矩形

import cv2 as cv
img=cv.imread('img/wx(1).jpg')
img2=cv.imread('img/wx(1).jpg')
#矩形描点:左上角坐标(x,y),右下角坐标(x+w,y+h),w:宽,h:高
x,y,w,h=100,100,40,40
#绘制矩形 (图片对象,坐标(),颜色(),宽度)
cv.rectangle(img,(x,y,x+w,y+h),color=(0,255,0),thickness=2)  #color(BGR)
cv.imshow('rectangle_img',img)
cv.waitKey(2000)#绘制圆形:(原点坐标(),半径,颜色,宽度)
cv.circle(img2,center=(100,100),radius=40,color=(0,0,255),thickness=2)
cv.imshow('circle_img',img2)
cv.waitKey(2000)
cv.destroyAllWindows()

6. 多人人脸检测

import cv2 as cv
def face_detact_demo(img_path):img=cv.imread(img_path)if img is None:print("Error:img_path error!")return# 1:灰度处理并适当更改尺寸大小# img=cv.resize(img,dsize=(1000,600))gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)# 2:加载特征数据,获取特征对象face_detector=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')if face_detector.empty():print("Error:Failed to load haarcascade_frontalface_default.xml")return# 3:检测人脸,获取范围坐标faces = face_detector.detectMultiScale(gray)# faces=face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=3,flags=0,maxSize=(35,35),minSize=(29,29))# detectMultiScale(image,scaleFactor = 1.1,minNeighbors = 3,flags = 0,minSize = Size(),maxSize = Size())if len(faces)==0:print("Error:NO faces face_detected!")returnelse:# 在监测的人脸范围绘制矩形for (x,y,w,h) in faces:print(x,y,w,h)cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.circle(img,(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)cv.imshow('face_detect',img)cv.waitKey(10000)img_path='img/m.jpg'
face_detact_demo(img_path)
cv.destroyAllWindows()

由特征对象获取人脸范围坐标时,因图片中人脸的精准度问题可能存在获取非人脸范围,因此需要调节函数参数,实现高效扫描

face_detector.detectMultiScale 是 OpenCV 库中用于人脸检测的一个常用函数。这个函数属于 Haar 或 LBP 特征分类器的一部分,通常用于在图像中检测不同大小的人脸

std::vector<Rect> detectMultiScale(InputArray image,double scaleFactor = 1.1,int minNeighbors = 3,int flags = 0,Size minSize = Size(),Size maxSize = Size()
);

参数介绍:

  1. image: 输入图像,通常是一个灰度图像(尽管也可以传入彩色图像,但内部会自动转换为灰度图)。
  2. scaleFactor: 图像缩放的比例因子。例如,1.1 表示每次图像尺寸变为原来的 1.1 倍。该参数决定了图像金字塔的层数,从而影响检测到的人脸的大小范围。
  3. minNeighbors: 每个候选矩形区域需要有多少个相邻的矩形区域来保留该区域,也就是扫描该范围多少次。这个参数影响检测的准确度和检测到的区域的数量。
  4. flags: 修改检测方法的标志。可以是以下值的组合:
    • CASCADE_SCALE_IMAGE: 按比例缩放图像。默认开启。
    • CASCADE_FIND_BIGGEST_OBJ: 只返回最大的对象。
    • CASCADE_DO_ROUGH_SEARCH: 只做粗略搜索。
    • CASCADE_DO_CANNY_PRUNING: 使用 Canny 边缘检测器来丢弃一些边缘太多的图像区域。
    • CASCADE_SCALE_IMAGE 和 CASCADE_DO_ROUGH_SEARCH 通常默认开启,其他标志可能需要根据具体需求来设置。
  1. minSize: 目标对象的最小可能尺寸。
  2. maxSize: 目标对象的最大可能尺寸。

返回值

该函数返回一个 Rect 对象的向量,每个 Rect 对象代表检测到的人脸的位置和大小

7. 视频人脸检测:

import cv2 as cv
def faces_detect_demo(img):#灰度处理gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#加载特征数据face_detector = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')if face_detector.empty():print("Error: failed to load face_detector!")return#检测人脸范围face=face_detector.detectMultiScale(gray)#绘制人脸矩形for(x,y,w,h)in face:print(x,y,w)cv.rectangle(img,(x,y),(x+w,y+h),color=(255,0,255),thickness=2)cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(255,0,0),thickness=2)#显示图片cv.imshow('vedio_detect',img)#1:读取本地视频
# "D:\桌面\代码\video.mp4"
cap1=cv.VideoCapture('v.mp4')
#2:调用自己的摄像头
cap=cv.VideoCapture(0)while True:#flag为监测标志位flag为false时退出视频监测#frame为视频中读取每一帧的的图片对象flag,frame=cap.read()if not flag:break#进行方法监测faces_detect_demo(frame)# 键入空格退出,否则循环检测if ord('q')==cv.waitKey(3000):break
cv.destroyAllWindows()
cap.release()

以上提供两种视频提供:

#1:读取本地视频
cap1=cv.VideoCapture('v.mp4')
#2:调用自己的摄像头
cap2=cv.VideoCapture(0)

继而循环从视频中提取图片对象:flag,frame=cap.read() 进行方法检测人脸

flag 以及 操作键入值 q 作为循环是否继续的判断

8. 人脸数据训练:

import os
import sys
import cv2
import numpy as np
from PIL import Imagedef getImageAndLabels(path):facesSamples=[]ids=[]#将路径与文件名称结合 以列表形式存储imagePaths=[os.path.join(path,f) for f in os.listdir(path)]# 加载特征数据face_detector = cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')if face_detector.empty():print("Error: failed to load face_detector!")return#遍历列表中的图片for imagePath in imagePaths:#打开图片PIL_img=Image.open(imagePath).convert('L')#将图片转为数组img_numpy=np.array(PIL_img,'uint8')# 检测人脸范围face = face_detector.detectMultiScale(img_numpy)#获取图片id#将路径中第二部分文件名中的数据id由‘.’进行分割,将字符串转换为整形存储id=int(os.path.split(imagePath)[1].split('.')[0])for x,y,w,h in face:#将人脸检测范围进行切片处理,作为图像数组facesSamples.append(img_numpy[y:y+h,x:x+w])ids.append(id)return facesSamples,idsif __name__ == '__main__':#图片路径:path='./data/jm/'#获取图像数组以及id标签数组faces,ids=getImageAndLabels(path)#获取循环对象recognizer=cv2.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))#保存文件recognizer.write('trainer/trainer.yml')

获取训练集:

9. 人脸识别:

基于 LBPH 的人脸识别

LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中 的对应单元进行比较,对每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH 是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。 调整后的区域中调用 predict()函数,该函数返回两个元素的数组:第一个元素是所识别 个体的标签,第二个是置信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来 衡量所识别人脸与原模型的差距,0 表示完全匹配。可能有时不想保留所有的识别结果,则 需要进一步处理,因此可用自己的算法来估算识别的置信度评分。LBPH 一个好的识别参 考值要低于 50 ,任何高于 80 的参考值都会被认为是低的置信度评分。

import cv2
import os
import numpy as np#加载训练数据文件
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
#准备识别的图片
img=cv2.imread('./img/10.pgm')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
face=face_detector.detectMultiScale(gray)
for x,y,w,h in face:cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),thickness=2)#人脸识别id,confidence=recognizer.predict(gray[y:y+h,x:x+w])print('标签id:',id,'置信评分:',confidence)print('置信评分范围低于 50,高于80为低的置信度评分')img2_path='data/jm/'+str(id)+'.pgm'img2=cv2.imread(img2_path)
#扩大图像尺寸
img=cv2.resize(img,(300,300))
img2=cv2.resize(img2,(300,300))
#face_detect 检测图像展示
cv2.imshow('face_detect',img)
#recognize_img 原始图像成功比对图片
cv2.imshow('recognize_img',img2)
cv2.waitKey(8000)

相关文章:

人脸识别【python-基于OpenCV】

1. 导入并显示图片 #导入模块 import cv2 as cv#读取图片 imgcv.imread(img/wx(1).jpg) #路径名为全英文&#xff0c;出现中文 图片加载失败,"D:\picture\wx.jpg" #显示图片 &#xff08;显示标题&#xff0c;显示图片对象&#xff09; cv.imshow(read_picture,im…...

redis常用命令和内部编码

文章目录 redis 为什么快redis中的Stringsetsetnxsetex getmsetmget计数操作incr、incrby、decr、decrby、incrbyfloatincrincrbyincrbyfloat 拼接&#xff08;append&#xff09;、获取(getrange)、修改字符串(setrange)、获取字符串长度(strlen)操作appendgetrangesetrangest…...

UI操作总结

该类 SolarWebx 继承自 Webx 和 IUixLikeMixin&#xff0c;主要用于扩展 giraffe.EasyUILibrary 的功能&#xff0c;提供了一系列与网页操作、元素定位、截图、图片处理等相关的方法。以下是对该类中每个方法的简要总结&#xff1a; __init__ 方法 作用&#xff1a;初始化 Sola…...

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…...

力扣hot100-->滑动窗口、贪心

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…...

Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口

在 Linux 内核的开发中,高效处理并发任务和数据结构的管理是提升系统性能的关键。特别是在网络子系统中,处理大量数据包的任务对性能和并发性提出了极高的要求。本文将深入探讨 Linux 内核中的 hlist_add_head_rcu 函数及其在 NAPI(网络接收处理接口)中的应用,揭示这些机制…...

centos哪个版本建站好?centos最稳定好用的版本

在信息化飞速发展的今天&#xff0c;服务器操作系统作为构建网络架构的基石&#xff0c;其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统&#xff0c;凭借其强大的性能、出色的稳定性和丰富的软件包资源&#xff0c;成为众多用户建…...

软件越跑越慢的原因分析

如果是qt软件&#xff0c;可以用Qt Creator Profiler 作性能监控如果是通过web请求&#xff0c;可以用JMeter监控。 软件运行过程中逐渐变慢的现象&#xff0c;通常是因为系统资源&#xff08;如 CPU、内存、磁盘 I/O 等&#xff09;逐渐被消耗或软件中存在性能瓶颈。这个问题…...

LeetCode 力扣热题100 二叉树的直径

class Solution { public:// 定义一个变量 maxd&#xff0c;用于存储当前二叉树的最大直径。int maxd 0; // 主函数&#xff0c;计算二叉树的直径。int diameterOfBinaryTree(TreeNode* root) {// 调用 maxDepth 函数进行递归计算&#xff0c;并更新 maxd。maxDepth(root);// …...

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…...

小哆啦解题记:整数转罗马数字

小哆啦解题记&#xff1a;整数转罗马数字 小哆啦开始力扣每日一题的第十四天 https://leetcode.cn/problems/integer-to-roman/submissions/595220508/ 第一章&#xff1a;神秘的任务 一天&#xff0c;哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想&#xff1a;…...

【Java数据结构】排序

【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法&#xff1a;挖坑法&#xff…...

我的求职之路合集

我把我秋招和春招的一些笔面试经验在这里发一下&#xff0c;网友们也可以参考一下。 我的求职之路&#xff1a;&#xff08;1&#xff09;如何谈自己的缺点 我的求职之路&#xff1a;&#xff08;2&#xff09;找工作时看重的点 我的求职之路&#xff1a;&#xff08;3&…...

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…...

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代&#xff0c;数据如同新时代的石油&#xff0c;蕴含着巨大的价值。从商业决策到科研探索&#xff0c;从城市规划到环境监测&#xff0c;海量数据的高效处理、精准分析与直观可视化&#xff0c;已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…...

LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验

为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第六期的主题是 《AI向导接口服务的能力与接入方案》 随着地图应…...

AI导航工具我开源了利用node爬取了几百条数据

序言 别因今天的懒惰&#xff0c;让明天的您后悔。输出文章的本意并不是为了得到赞美&#xff0c;而是为了让自己能够学会总结思考&#xff1b;当然&#xff0c;如果有幸能够给到你一点点灵感或者思考&#xff0c;那么我这篇文章的意义将无限放大。 背景 随着AI的发展市面上…...

openstack单机安装

openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本&#xff0c;请参考openstack官网。 网卡配置 需要配…...

Vue3实现小红书瀑布流布局任意组件动态更新页面方法实践

思路 1.首先定义一个瀑布流容器&#xff0c;它的高度暂定&#xff08;后面会更新&#xff09;。把需要布局的组件&#xff08;这里叫做waterfall-item&#xff09;放在瀑布流容器里面渲染出来。使用绝对定位&#xff08;position: absolute&#xff09;&#xff0c;把它移到屏幕…...

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…...

Next.js 实战 (十):中间件的魅力,打造更快更安全的应用

什么是中间件&#xff1f; 在 Next.js 中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种用于处理每个传入请求的功能。它允许你在请求到达页面之前对其进行修改或响应。 通过中间件&#xff0c;你可以实现诸如日志记录、身份验证、重定向、CORS配置、压缩等任务…...

python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传

目录 鼠标事件 悬停 移动 按键 点击 滚轮操作 拖拽 键盘事件 输入文本内容 type输入内容 fill输入内容 按键操作press 文件上传 下拉选/单选框/复选框 滚动条操作 鼠标事件 悬停 page.get_by_text(设置,exactTrue).nth(1).hover() 移动 page.mouse.move(x33…...

【论文+源码】Diffusion-LM 改进了可控文本生成

这篇论文探讨了如何在不重新训练的情况下控制语言模型&#xff08;LM&#xff09;的行为&#xff0c;这是自然语言生成中的一个重大开放问题。尽管近期一些研究在控制简单句子属性&#xff08;如情感&#xff09;方面取得了成功&#xff0c;但在复杂的细粒度控制&#xff08;如…...

双目立体校正和Q矩阵

立体校正 对两个摄像机的图像平面重投影&#xff0c;使二者位于同一平面&#xff0c;而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R&#xff0c;T) 从上图中可以看出&#xff0c;该算法主要分为两步&#xff1a; 使成像平面共面 这个办法很直观&#xff…...

vscode 自用插件

vscode按住ctrl鼠标左键无法跟踪跳转方法名&#xff0c;装这些插件就可以 vscode-elm-jump:常规的代码跳转定义 Vue CSS Peek:跳转css定义 vue-helper:变量函数只跳转定义 Vetur 代码提示 Baidu Comate 自动帮你写console.log Turbo Console Log: ctrl alt l 选中变量之后&am…...

OpenCV:在图像中添加高斯噪声、胡椒噪声

目录 在图像中添加高斯噪声 高斯噪声的特性 添加高斯噪声的实现 给图像添加胡椒噪声 实现胡椒噪声的步骤 相关阅读 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像滤波、卷积与…...

DuckDB:Golang操作DuckDB实战案例

DuckDB是一个嵌入式SQL数据库引擎。它与众所周知的SQLite非常相似&#xff0c;但它是为olap风格的工作负载设计的。DuckDB支持各种数据类型和SQL特性。凭借其在以内存为中心的环境中处理高速分析的能力&#xff0c;它迅速受到数据科学家和分析师的欢迎。在这篇博文中&#xff0…...

MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

kotlin的协程的基础概念

Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念&#xff1a; 协程&#xff08;Coroutines&#xff09; &#xff1a; 协程是一种用于处理并发任务的编程模型&#xff0c;它可以在单…...

Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)

SpringMVC使用 二.SpringMVC接收数据2.1访问路径设置2.2接收参数1.param和json2.param接收数据3 路径 参数接收4.json参数接收 2.3接收cookie数据2.4接收请求头数据2.5原生api获取2.6共享域对象 三.SringMVC响应数据3.1返回json数据ResponseBodyRestController 3.2返回静态资源…...