OpenCV自学笔记二十六:人脸检测

目录

一、人脸检测

二、LBPH人脸识别

三、EigenFaces人脸识别

四、Fisherfaces人脸识别


一、人脸检测

在OpenCV中,人脸检测是一个常见的计算机视觉任务,可以通过Haar级联分类器来实现。Haar级联分类器是一种基于机器学习的目标检测方法,利用Haar特征和级联分类器进行人脸检测。

Haar特征是一种基于图像局部区域的特征描述符,它通过计算图像中不同位置和尺度的矩形区域的像素差值和来表示图像的特征。Haar特征包括边缘特征、线性特征和中心特征等。级联分类器是由多个弱分类器组成的级联结构,每个弱分类器根据Haar特征对图像进行二分类判别。

在OpenCV中,人脸检测的函数为`cv.CascadeClassifier()`。下面是一个使用OpenCV进行人脸检测的示例代码:

import cv2 as cv# 加载人脸检测器face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像image = cv.imread('input.jpg')# 转换为灰度图像gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 进行人脸检测faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在图像上绘制检测到的人脸for (x, y, w, h) in faces:cv.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)# 显示结果图像cv.imshow('Face Detection', image)cv.waitKey(0)cv.destroyAllWindows()

在上述示例中,我们首先加载了一个训练好的人脸检测器,通过`CascadeClassifier()`函数指定了Haar级联分类器的文件路径。然后,读取一张输入图像,并将其转换为灰度图像,因为人脸检测通常在灰度图像上进行。接下来,调用`detectMultiScale()`函数进行人脸检测,其中包括了一些参数设置,如缩放因子、邻近矩形个数和最小检测尺寸等。最后,在原始图像上绘制检测到的人脸位置,并显示结果图像。

运行以上代码,将展示原始图像,并在检测到的人脸位置绘制矩形框。

二、LBPH人脸识别

在OpenCV中,LBPH(Local Binary Patterns Histograms)是一种常用的人脸识别算法。LBPH算法通过提取局部二值模式(Local Binary Patterns)特征,并构建特征直方图进行人脸识别。

LBPH算法的原理如下:

1. 将输入图像转换为灰度图像。

2. 对每个像素点的邻域进行采样,将其与中心像素值进行比较,得到二值编码。如果邻域像素值大于等于中心像素值,则该像素点被标记为1,否则标记为0。

3. 将二值编码连接起来,得到一个二进制数。这个二进制数被称为局部二值模式。

4. 根据局部二值模式构建特征直方图,统计不同的模式出现次数。

5. 使用特征直方图进行人脸识别,比较待识别人脸的特征直方图与已知人脸的特征直方图之间的相似性。

OpenCV中,LBPH人脸识别的函数为`cv.face.LBPHFaceRecognizer_create()`。下面是一个使用LBPH算法进行人脸识别的示例代码:

import cv2 as cvimport os# 加载训练数据data_path = 'data'face_images = []face_labels = []for label_name in os.listdir(data_path):label_path = os.path.join(data_path, label_name)for image_name in os.listdir(label_path):image_path = os.path.join(label_path, image_name)face_images.append(cv.imread(image_path, 0))face_labels.append(int(label_name))# 创建LBPH人脸识别器recognizer = cv.face.LBPHFaceRecognizer_create()# 训练识别器recognizer.train(face_images, np.array(face_labels))# 进行人脸识别test_image = cv.imread('test.jpg', 0)label, confidence = recognizer.predict(test_image)print("识别结果:", label)print("置信度:", confidence)

在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个LBPH人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

需要注意的是,LBPH算法对于光照变化和遮挡比较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法。

三、EigenFaces人脸识别

在OpenCV中,EigenFaces是一种常用的人脸识别算法,基于主成分分析(Principal Component Analysis,PCA)进行特征提取和人脸识别。

EigenFaces算法的原理如下:

1. 首先,将输入图像集转换为灰度图像,并将每个图像拉平为一个向量。

2. 将所有训练图像的数据向量按列堆叠,得到一个数据矩阵。

3. 对数据矩阵进行均值归一化,即减去所有数据向量的均值。

4. 对均值归一化后的数据矩阵进行主成分分析(PCA),得到特征向量和对应的特征值。特征向量通常被称为Eigenfaces。

5. 选择保留最大特征值的前N个特征向量,将它们作为人脸识别的特征。

6. 对于待识别的人脸,将其数据向量减去均值,并投影到特征空间中。

7. 使用最近邻分类器或其他方法,将待识别人脸与已知人脸进行比较,找到最相似的人脸。

在OpenCV中,EigenFaces人脸识别的函数为`cv.face.EigenFaceRecognizer_create()`。下面是一个使用EigenFaces算法进行人脸识别的示例代码:

import cv2 as cvimport os# 加载训练数据data_path = 'data'face_images = []face_labels = []for label_name in os.listdir(data_path):label_path = os.path.join(data_path, label_name)for image_name in os.listdir(label_path):image_path = os.path.join(label_path, image_name)face_images.append(cv.imread(image_path, 0))face_labels.append(int(label_name))# 创建EigenFaces人脸识别器recognizer = cv.face.EigenFaceRecognizer_create()# 训练识别器recognizer.train(face_images, np.array(face_labels))# 进行人脸识别test_image = cv.imread('test.jpg', 0)label, confidence = recognizer.predict(test_image)print("识别结果:", label)print("置信度:", confidence)

在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个EigenFaces人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

需要注意的是,EigenFaces算法对于光照变化较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法。

四、Fisherfaces人脸识别

在OpenCV中,Fisherfaces是一种常用的人脸识别算法,基于线性判别分析(Linear Discriminant Analysis,LDA)进行特征提取和人脸识别。

Fisherfaces算法的原理如下:

1. 首先,将输入图像集转换为灰度图像,并将每个图像拉平为一个向量。

2. 将所有训练图像的数据向量按列堆叠,得到一个数据矩阵。

3. 对数据矩阵进行均值归一化,即减去所有数据向量的均值。

4. 计算类内散布矩阵(within-class scatter matrix)和类间散布矩阵(between-class scatter matrix)。

5. 对类内散布矩阵和类间散布矩阵进行特征值分解,得到特征向量和对应的特征值。

6. 选择保留最大特征值的前N个特征向量,将它们作为人脸识别的特征。

7. 对于待识别的人脸,将其数据向量减去均值,并投影到特征空间中。

8. 使用最近邻分类器或其他方法,将待识别人脸与已知人脸进行比较,找到最相似的人脸。

在OpenCV中,Fisherfaces人脸识别的函数为`cv.face.FisherFaceRecognizer_create()`。下面是一个使用Fisherfaces算法进行人脸识别的示例代码:

import cv2 as cvimport os# 加载训练数据data_path = 'data'face_images = []face_labels = []for label_name in os.listdir(data_path):label_path = os.path.join(data_path, label_name)for image_name in os.listdir(label_path):image_path = os.path.join(label_path, image_name)face_images.append(cv.imread(image_path, 0))face_labels.append(int(label_name))# 创建Fisherfaces人脸识别器recognizer = cv.face.FisherFaceRecognizer_create()# 训练识别器recognizer.train(face_images, np.array(face_labels))# 进行人脸识别test_image = cv.imread('test.jpg', 0)label, confidence = recognizer.predict(test_image)print("识别结果:", label)print("置信度:", confidence)

在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个Fisherfaces人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

需要注意的是,Fisherfaces算法对于光照变化和遮挡比较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法。

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

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

相关文章

TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案

一、方案背景 随着人工智能技术的快速发展以及视频监控系统在全国范围内的迅速推进,基于AI视频智能分析技术的智能视频监控与智慧监管系统,也已经成为当前行业的发展趋势。在工业制造与工业生产领域,工厂对设备的巡检管理、维护维修、资产管…

【全志V3s】SPI NAND Flash 驱动开发

文章目录 一、硬件介绍V3s的启动顺序 二、驱动支持U-Boot驱动主线 Linux 驱动已经支持 三、烧录工具 xfel四、构建U-Boot(官方的Uboot)先编译一下开始spi nand flash 代码层面的适配修改menuconfig配置ARM architecture配置Support for SPI Nand Flash o…

前端大批量并发请求的处理

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>测试大批量并发异步请求</title> </…

关于线程池

线程池是一种多线程处理方式&#xff0c;通过将任务添加到队列中&#xff0c;在创建线程后自动启动这些任务。线程池中的线程可以复用&#xff0c;可以控制最大并发数&#xff0c;并且方便管理&#xff0c;也就是说&#xff0c;线程池会提前创建好一些线程&#xff0c;当后续需…

rabbitMQ (1)

文章目录 1. RabbitMQ 介绍1.1 几个重要概念1.2 RabbitMq 的工作原理 2 RabbitMQ 安装3. RabbitMQ 入门操作3.1 添加依赖3.2 生产者代码3.3 消费者代码 4. Work Queues5. 管理端页面创建队列 1. RabbitMQ 介绍 引用 &#xff1a; RabbitMQ 是一个消息中间件&#xff1a;它接受…

Xilinx FPGA 程序固化重新上电程序不运行的问题

问题描述 FPGA直接下载bit文件,功能正常。 FPGA擦除FLASH,烧写FLASH,正常。 电源断电,重新上电,FALSH里面的程序没有启动,FPGA程序没有跑起来。–FLASH启动不正常。 解决办法 在XDC约束文件里边增加约束: ## Configuration options, can be used for all designs se…

JsonPath详解

JsonPath 简介 JsonPath是一种信息抽取类库&#xff0c;是从JSON文档中抽取指定信息的工具文档 http://goessner.net/articles/JsonPath 安装 pip install jsonpath 使用 注意&#xff1a;这里的json_data为python数据&#xff0c;如列表&#xff0c;字典 data jsonpath.…

[Linux入门]---Linux项目自动化构建工具-make/Makefile

目录 1.背景2.make指令输入make默认为Makefile文件第一条指令执行Makefile文件对gcc指令特殊处理及原理特殊符号 3.总结 1.背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放…

CNN(九):Inception v3算法实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 理论基础 Inception v3论文 Inception v3由谷歌研究员Christian Szegedy等人在2015年的论文《Rethinking the Inception Architecture f…

Jmeter集成到jenkins

Jmeter集成到Jenkins Jmeter集成到Jenkins. 1 软件下载... 4 一:环境配置... 4 1.JDK安装&#xff1a;... 4 配置JDK环境变量... 5 2.Jmeter安装&#xff1a;... 5 配置jmeter环境变量... 6 3.安装Ant 7 配置Ant环境变量... 7 4.Git安装&#xff1a;... 8 配置git环境…

C++笔试

数据大小 #define ll long long int 最大值&#xff1a;21,4748,3647 int 最小值&#xff1a;-2147483648 float 最大值&#xff1a;3.40282e38 float 最小值&#xff1a;1.17549e-38 double 最大值&#xff1a;1.79769e308 double 最小值&#xff1a;2.22507e-308 long 最…

Untiy UDP局域网 异步发送图片

同步画面有问题&#xff0c;传图片吧 using System.Text; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using System.Net; using System; using System.Threading.Tasks; using Sy…

java内嵌浏览器CEF-JAVA、jcef、java chrome

java内嵌浏览器CEF-JAVA、jcef、java chrome jcef是老牌cef的chrome内嵌方案&#xff0c;可以进行java-chrome-h5-桌面开发&#xff0c;下面为最新版本&#xff08;2023年9月22日10:33:07&#xff09; JCEF&#xff08;Java Chromium Embedded Framework&#xff09;是一个基于…

Cesium 空间量算——生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

板子接线图

1.ST-LINK V2接线 2.对抗板子刷蓝牙固件 接USB转TTL&#xff0c;用镊子短接两个孔 2.对抗板子用串口测试蓝牙AT命令 短接白色箭头&#xff0c;接TX&#xff0c;RX&#xff0c;电源

brpc 学习(一)M1 MacOS构建方法

tags: brpc categories: brpc 写在前面 实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来,…

Debezium系列之:Debezium采集Mysql数据库,数据库时间字段值的变化

Debezium系列之:Debezium采集Mysql数据库,数据库时间字段值的变化 一、背景二、创建时间字段表三、设置数据库时区四、UTC时区时间字段值变化五、北京时区时间字段值变化一、背景 Debezium使用UTC时区来发出时间列,可以通过使用 CustomConverter来使用任意时区发出时间列。使…

MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储

Windows系统实现多磁盘存储 1.为什么2.多磁盘存储2.1 数据库配置2.2 文件夹磁盘映射2.3 创建新的数据集 3.总结 1.为什么 这里仅针对只有一台Windows系统服务器的情景&#xff1a; 当服务器存储不足时&#xff0c;或者要接入更多的数据&#xff0c;就会挂载新磁盘&#xff0c…

边缘计算AI智能安防监控视频平台车辆违停算法详解与应用

随着城市车辆保有量呈现高速增长趋势&#xff0c;交通拥堵、违章行为也日益泛滥。因为车辆未停放在指定区域导致的车位浪费、占用/堵塞交通要道、车辆剐蹭等问题层出不穷。通过人工进行违法停车的监控&#xff0c;不仅让监控人员工作负荷越来越大&#xff0c;而且存在发现不及时…

信息化发展51

部署交付 1 、软件开发完成后&#xff0c; 必须部署在最终用户的正式运行环境&#xff0c; 交付给最终用户使用&#xff0c; 才能为用户创造价值。 2 、软件部署是一个复杂过程&#xff0c; 包括从开发商发放产品&#xff0c; 到应用者在他们的计算机上实际安装并维护应用的所…