人工智能实验:人脸检测

news2024/11/23 23:06:37

一、实现目的:

  1. 了解人脸检测的主要方法;
  2. 了解 detectMultiScale 函数的功能及用法;
  3. 掌握使用 OpenCV 提供的分类器和检测器进行人脸检测的方法。

二、实验设备:

  1. 计算机一台;
  2. 视觉实验软件环境及资源一套(visual studio 2022,opencv-4.8)。

环境配置请参考以下文章:

  1. http://t.csdnimg.cn/ku3rS
  2. http://t.csdnimg.cn/owEsG
  3. http://t.csdnimg.cn/vEe72

三、实验原理:

人脸检测(Face Detection),就是给一幅图像,找出图像中的所有人脸位置, 通常用一个矩形框框起来,如下图所示。其输入是一幅图像 image,输出是若 干个包含人脸的矩形框位置(x,y,w,h)。人脸检测属于计算机视觉的范畴,早期人 们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景 下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来。 目前人脸检测的方法主要有以下两大类。

287b39fd3705482f9a25f6881eb784d5.png

基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛、 眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。主要 包括模板匹配、人脸特征、形状与边缘、纹理特性、颜色特征等方法。

基于统计的方法:将人脸看作一个整体的模式——二维像素矩阵,从统计的 观点通过大量人脸图像样本构造人脸模式空间,根据相似度来判断人脸是否存在。 主要包括主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、 Adaboost 算法等。

本次实验将使用Haar+AdaBoost 的算法,实现任意图像中人脸的检测。OpenCV 自带了训练器和检测器,还包含了人脸检测的 XML 文件, 如下图所示。这些文件位于:

D:\software\other\opencv\build\etc\haarcascades
# 其中:D:\software\other是我自己的安装目录

文件夹, 主要保存相关的特征矩阵,以及各个弱分类器相关的信息,可用于检测静止图像、 视频和摄像头所得到图像中的人脸。除此之外还有一个同级文件夹是 lbpcascades, 它不是通过 Haar 特征进行人脸检测,而是采用的 LBP 特征,这里仅作了解,不再细究。

d97716a0f9b14081b62c8220cbed1d37.png

四、算法接口:

CascadeClassifier 是 OpenCV 中用来做目标检测的级联分类器的一个类。早期 OpenCV 版本仅支持 Haar 特征的目标检测,新版本开始支持 LBP 和 HOG 特 征的目标检测。CascadeClassifier 类有一个 detectMultiScale 的成员函数用于调整检测参数,检测目标图像并得到检测结果。

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

【image】:输入图像。

【objects】:检测到的目标的矩形框向量组。

【scaleFactor】:在前后两次相继的扫描中搜索窗口的比例系数。默认为 1.1,即每次搜索    窗口依次扩大 10%。

【minNeighbors】:每个目标至少要被检测到不低于该值的次数才算是真的目标。

【flags】:旧版本的 OpenCV 1.x 使用的参数,当前版本已被忽略。

【minSize 和 maxSize】:限制检测到的目标尺寸。

五、实验任务:

1 基础任务:

  1. 搭建实验环境;
  2. 根据指导书示例完成人脸检测实验;
  3. 完成实验报告。

2 拓展任务:

  1. 调整 minNeighbors 参数的值,观察对人脸检测结果的影响。
  2. 调整 minSize 和 maxSize 参数的值,观察对人脸检测结果的影响。
  3. 修改程序,实现在视频流中进行动态的人脸检测。

六、实验内容:

1 搭建实验环境:

见上述推荐的参考文章。

2 人脸检测示例运行:

2.1 人脸识别:

2.1.1 测试代码:

//人脸检测
#include <vector>
#include <opencv2/opencv.hpp>
int main()
{
	// 创建级联分类器对象,并加载 OpenCV 自带的人脸分类器
	cv::CascadeClassifier faceDetector("D:/software/other/opencv/build/etc/haarcascades/haarcascade_frontalface_alt2.xml");
		cv::Mat image = cv::imread("D:/Projects/visio projects/opencv_test1/test_picture/test1.jpg");
	// 用于储存检测结果的矩形框向量组
	std::vector<cv::Rect> objects;
	// 使用分类器进行目标检测,并设置相关参数
	faceDetector.detectMultiScale(image, objects, 1.1, 3);
	// 在原图上绘制检测得到的矩形框,并显示出来
	for (int i = 0; i < objects.size(); ++i) {
		cv::rectangle(image, objects[i], cv::Scalar(0, 0, 255));
	}
	cv::imshow("face_detection", image);
	cv::waitKey(0);
	return 0;
}

2.1.2 运行结果:

ea8944a32a7f4ffe8053e54daa06fe93.png

注意这里左下角有个柱子被错误的检测为人脸,后面有用。

2.2 猫脸识别:

2.2.1 测试代码:

//猫脸识别
#include <vector>
#include <opencv2/opencv.hpp>
int main()
{
	// 创建级联分类器对象,并加载 OpenCV 自带的猫脸分类器
	cv::CascadeClassifier faceDetector("D:/software/other/opencv/build/etc/haarcascades/haarcascade_frontalcatface.xml");
	cv::Mat image = cv::imread("D:/Projects/visio projects/opencv_test1/test_picture/test3.jpg");
// 用于储存检测结果的矩形框向量组
std::vector<cv::Rect> objects;
// 使用分类器进行目标检测,并设置相关参数
faceDetector.detectMultiScale(image, objects, 1.1, 3);
// 在原图上绘制检测得到的矩形框,并显示出来
for (int i = 0; i < objects.size(); ++i) {
cv::rectangle(image, objects[i], cv::Scalar(0, 255, 0));
}
cv::imshow("cat_face_detection", image);
cv::waitKey(0);
return 0;
		}

2.2.2 运行结果:

c817f56c13c748f2ad9ec806df2378e4.png

3 拓展任务:

(1)调整人脸识别代码中的 minNeighbors 参数的值从3调整为30:

	faceDetector.detectMultiScale(image, objects, 1.1, 30);
974bb592516e44c59e106381f86ff8a4.png

可以观察到,原来被误识别为人脸的柱子的检测框不见了。

 

(2)调整猫脸识别代码中的 minSize 和 maxSize 参数的值:

因为测试代码中没有定义minSize 和 maxSize 参数的值,所以我们加入以下代码:

// 调整 minSize 和 maxSize 参数的值
cv::Size minSize(10, 10); // 设置最小尺寸
cv::Size maxSize(50, 50); // 设置最大尺寸

// 使用分类器进行目标检测,并设置相关参数
faceDetector.detectMultiScale(image, objects, 1.1, 3, 0, minSize, maxSize);

新的完整代码如下:

//猫脸识别
#include <vector>
#include <opencv2/opencv.hpp>
int main()
{
	// 创建级联分类器对象,并加载 OpenCV 自带的猫脸分类器
	cv::CascadeClassifier faceDetector("D:/software/other/opencv/build/etc/haarcascades/haarcascade_frontalcatface.xml");
	cv::Mat image = cv::imread("D:/Projects/visio projects/opencv_test1/test_picture/test3.jpg");
// 用于储存检测结果的矩形框向量组
std::vector<cv::Rect> objects;
// 调整 minSize 和 maxSize 参数的值
cv::Size minSize(10, 10); // 设置最小尺寸
cv::Size maxSize(50, 50); // 设置最大尺寸

// 使用分类器进行目标检测,并设置相关参数
faceDetector.detectMultiScale(image, objects, 1.1, 3, 0, minSize, maxSize);
// 在原图上绘制检测得到的矩形框,并显示出来
for (int i = 0; i < objects.size(); ++i) {
cv::rectangle(image, objects[i], cv::Scalar(0, 255, 0));
}
cv::imshow("cat_face_detection", image);
cv::waitKey(0);
return 0;
		}
3a431888a5294e6f821aa1bdec70dc97.png

可以看到脸大的猫猫都检测不到了

(3)修改程序,实现在视频流中进行动态的人脸检测:

要在视频流中进行动态人脸检测,需要使用 OpenCV 读取实时视频流(例如,从网络摄像头获取的视频)并对每一帧进行人脸检测,代码如下:

#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
    // 创建级联分类器对象,并加载 OpenCV 自带的人脸分类器
    cv::CascadeClassifier faceDetector("D:/software/other/opencv/build/etc/haarcascades/haarcascade_frontalface_alt2.xml");

    // 创建视频捕获对象,从默认摄像头读取视频
    cv::VideoCapture cap(0); // 0 表示默认摄像头

    if (!cap.isOpened()) {
        std::cerr << "Error: Unable to open camera" << std::endl;
        return -1;
    }

    // 循环读取视频流的每一帧
    while (true) {
        cv::Mat frame;
        cap >> frame; // 获取当前帧

        if (frame.empty()) {
            std::cerr << "Error: Empty frame" << std::endl;
            break;
        }

        // 用于储存检测结果的矩形框向量组
        std::vector<cv::Rect> faces;

        // 使用分类器进行人脸检测,调整缩放因子和最小邻近数等参数
        faceDetector.detectMultiScale(frame, faces, 1.1, 3, 0, cv::Size(30, 30));

        // 在帧上绘制检测得到的矩形框
        for (const auto& face : faces) {
            cv::rectangle(frame, face, cv::Scalar(0, 0, 255), 2); // 红色矩形框,线宽为 2
        }

        // 显示带有人脸检测框的当前帧
        cv::imshow("Face Detection", frame);

        // 检查是否按下 'q' 键退出
        if (cv::waitKey(1) == 'q') {
            break;
        }
    }

    cap.release(); // 释放摄像头
    cv::destroyAllWindows(); // 关闭所有 OpenCV 窗口

    return 0;
}

8a39b85f1244425694f65ce4e45d8f7c.jpeg

调用的摄像头检测我自己的大脸

 

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

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

相关文章

明星中药企业系列洞察(一)丨官宣提价后股价涨幅近15%,百年老字号佛慈制药如何焕发力量?

近日&#xff0c;佛慈制药发布公告称&#xff0c;鉴于原材料以及生产成本上涨等原因&#xff0c;公司对主营中成药产品的出厂价进行调整&#xff0c;平均提价幅度为9%。提价消息释出后&#xff0c;资本市场给出了态度&#xff1a;佛慈制药股价连续两天累计上涨近15%。佛慈制药近…

【一起深度学习——NIN】

NIN神经网络 原理图&#xff1a;代码实现&#xff1a;输出结果&#xff1a; 原理图&#xff1a; 代码实现&#xff1a; import torch from torch import nn from d2l import torch as d2ldef nin_block(in_channels, out_channels, kernel_size, strides, padding):return nn.…

HIDL Hal 开发指南7 —— 驱动开发

前言 HIDL HAL 的整体架构如下图所示&#xff1a; 接下来我们就来完成一个从驱动到 App 的完整 HIDL HAL 实现示例。 本节的任务是在内核中实现一个简单的驱动&#xff0c;并完成一个应用层 Native 程序来测试我们的驱动是否正常工作。 1 编写一个简单的 Linux 内核驱动 1.…

8G防火墙,WAF防火墙,可抵御各种恶意请求、恶意机器人、攻击防御

8G防火墙&#xff0c;WAF防火墙&#xff0c;可抵御各种恶意请求、恶意机器人、攻击防御 经过一年多的 beta 测试&#xff0c;8G 防火墙已准备好在生产现场使用。因此&#xff0c;您可以受益于 nG 防火墙&#xff08;又名 nG 黑名单&#xff09;的最新发展提供的强大保护。8G 防…

stm32单片机开发六、SPI通信协议

上一节看到了&#xff0c;I2C使用上拉电阻&#xff0c;导致了整个电路从低到高电平的时候出现了延时爬升&#xff0c;就会导致I2C的频率不高&#xff0c;一般在100K&#xff0c;告诉400K 但是SPI的速率可以达到很高&#xff0c;这就是SPI的优势 SS&#xff0c;从机选择线&#…

day-30 三角形最小路径和

思路 典型的动态规划问题,状态方程可以理解为min[i][j]min[i][j]Math.min(min[i-1][j-1],min[i-1][j])&#xff0c;在考虑边界的特殊处理即可 解题方法 最后得到的最后一行中的最小值即为最小路径和 Code class Solution {public int minimumTotal(List<List<Integer&…

相机内存卡格式化怎么恢复?恢复数据的3个方法

相机内存卡格式化后&#xff0c;许多用户都曾面临过照片丢失的困境。这些照片可能具有极高的纪念价值&#xff0c;也可能包含着重要的信息。因此如何有效地恢复这些照片变得至关重要。本文将详细介绍三种实用的恢复方法&#xff0c;帮助您找回那些珍贵的影像。 下面分享几个实…

BGP协议应用:SW1、SW2、SW3、RT1、RT2之间运行BGP协议

8.SW1、SW2、SW3、RT1、RT2之间运行BGP协议,SW1、SW2、RT1 AS号65001、RT2 AS号65002、SW3 AS号65003。 (1)SW1、SW2、SW3、RT1、RT2之间通过Loopback1建立IPv4 BGP邻居。SW1和SW2之间财务通过Loopback2建立IPv4 BGP邻居,SW1和SW2的Loopback2互通采用静态路由。 (2)SW1…

Linux——综合实验

要求 按照上面的架构部署一个简单的web节点所有的服务器使用DNS服务器作为自己的DNS服务器 就是/etc/reslov.conf 中nameserver的值必须是途中dns服务器的地址所有的数据库都是用mysql应用 nfs共享导出在客户端(web服务器上)使用autofs在自动挂载&#xff0c;或者写入/etc/fsta…

【免费】WordPress LskyPro0.1.0版本兰空图床插件无法启用修改代码方法

注&#xff1a;启用插件报错&#xff0c;按提示打开main.php文件找到215行代码&#xff0c;错误原因是函数里多了一个,号&#xff0c;应该是忘记去掉了&#xff0c;把&#xff0c;号去掉就可以了 目录 项目介绍功能计划功能快速入门相关文章&#xff1a; 项目介绍 此项目为通过…

OpenCV 库来捕获和处理视频输入和相似度测量(73)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :使用 OpenCV 创建视频(74) ​ 目标 如今&#xff0c;拥有数字视频录制系统供您使用是很常见的。因此&#xff0c;您最终会遇到不再处理一批图像&#xf…

Java代码基础算法练习-删除有序数组中的重复项-2024.05.07

任务描述&#xff1a; 给一个有序数组&#xff08;共10个元素&#xff09;&#xff0c;请在不新建数组的情况下&#xff0c;删除重复出现的元素&#xff0c;使 每个元素只出现一次&#xff0c;最后请输出删除重复元素后数组的新长度和数组元素。 解决思路&#xff1a; 要删除…

专题五_位运算(2)

目录 面试题 01.01. 判定字符是否唯一 解析 题解 268. 丢失的数字 解析 题解 371. 两整数之和 解析 题解 面试题 01.01. 判定字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:bool isUnique…

搭建Docker私有镜像仓库

大家好&#xff0c;今天给大家分享一下如何搭建私有镜像仓库&#xff0c;私有镜像仓库可以更好地管理和控制镜像的访问和使用&#xff0c;确保只有授权的人员能够获取和使用特定的镜像&#xff0c;而且方便团队内部共享定制化的镜像&#xff0c;提高开发和部署效率&#xff0c;…

【每天一个linux小知识】如何使用 oh-my-zsh 让使用zsh更高效

往期文章 tailf 和 tail -f nslookup 目录 往期文章对比演示zshoh-my-zsh安装自动提示、补全、语法高亮等插件参考 对比演示 使用 oh-my-zsh 之前&#xff1a; 使用 oh-my-zsh 之后&#xff1a; zsh 要使用oh-my-zsh前提是使用zsh。所以第一步安装zsh 可以看一下你的系统…

使用应变计进行建筑物的健康监测

在建筑健康监测领域&#xff0c;应变计是一种至关重要的传感器&#xff0c;用于评估结构的安全和性能。特别是振弦式应变计&#xff0c;以其高精度和稳定性&#xff0c;成为监测建筑物健康状态的首选工具。本文将探讨振弦式应变计的工作原理、应用方法以及在建筑健康监测中的最…

IEEE(TOP),CCF推荐,5本毕业神刊,最快7天录用!指标优秀

本期盘点计算机领域超顺快刊&#xff0c;涵盖IEEE1区TOP、CCF推荐SCIE&#xff0c;期刊指标优秀&#xff0c;审稿周期短&#xff0c;质量稳定&#xff0c;有意向作者请看下文&#xff1a; IEEE旗下1区&#xff08;TOP&#xff09; 1 期刊简介 ✅出版社&#xff1a;IEEE ✅影…

fero - yolo - mamba:基于选择性状态空间的面部表情检测与分类

fero - yolo - mamba:基于选择性状态空间的面部表情检测与分类 摘要IntroductionRelated work FER-YOLO-Mamba: Facial Expression Detection and Classification Based on Selective State Space 摘要 面部表情识别&#xff08;FER&#xff09;在理解人类情绪线索方面起着关键…

迅睿CMS中实现关键词搜索高亮

在迅睿CMS系统中实现关键词搜索高亮是提升用户体验和搜索效果的重要手段。当用户搜索某个关键词时&#xff0c;将搜索结果中的关键词高亮显示&#xff0c;可以帮助用户更快速地定位到所需信息。 关键词高亮的实现 在迅睿CMS中&#xff0c;你可以使用内置的dr_keyword_highlig…

Flask应用的部署和使用,以照片分割为例。

任务是本地上传一张照片&#xff0c;在服务器端处理后&#xff0c;下载到本地。 服务器端已经封装好了相关的程序通过以下语句调用 from amg_test import main from test import test main() test() 首先要在虚拟环境中安装flask pip install Flask 文件组织架构 your_pro…