opencv/C++ 人脸检测

news/2025/1/13 7:34:08/

前言

本文使用的测试资源说明:
opencv版本:opencv 4.6.0

人脸检测算法

Haar特征分类器

Haar特征分类器是一个XML文件,描述了人体各个部位的Haar特征值。包括:人脸、眼睛、鼻子、嘴等。
opencv 4.6.0自带的Haar特征分类器,包括:
在这里插入图片描述

人脸检测模型

haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml

  • 注:识别人体其它部位,只需替换对应的xml分类器即可。

detectMultiScale函数

/********************************************************************************
image:待检测图片,一般为灰度图像加快检测速度
objects:被检测物体的矩形框向量组
scaleFactor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口依次扩大10%
minNeighbors:表示构成检测目标的相邻矩形的最小个数(默认为3)。如果组成检测目标的小矩形的个数和小于min_neighbors-1都会被排除。如果min_neighbors为0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上
flags:默认值0。如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域
minSize:用来限制得到的目标区域的范围
maxSize:用来限制得到的目标区域的范围
********************************************************************************/
void detectMultiScale(const Mat& image,CV_OUT vector<Rect>& objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size()
);

原彩色图片测试

int test_func_1() {Mat img = imread("test_face/group1.jpg");imshow("test", img);//建立级联分类器CascadeClassifier cascade;//加载人脸检测器cascade.load("test_face/haarcascade_frontalface_alt2.xml");//人脸检测vector<Rect> faces;cascade.detectMultiScale(img,faces,1.1,3,0,Size(30,30));//显示人脸框if (faces.size()) {cout << "人脸数量:" << faces.size() << endl;for (size_t i = 0; i < faces.size(); i++) {rectangle(img,faces[i], Scalar(0,0,255),3,8,0);}}else {cout << "未检测到人脸" << endl;}imshow("test_2", img);waitKey(0);return 0;
}

测试结果

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

彩色图片转灰度后测试

先转成灰度图片,再送检测,以提升检测速度。

int test_func_2() {//建立级联分类器CascadeClassifier cascade;//加载人脸检测器cascade.load("test_face/haarcascade_frontalface_alt2.xml");//读取图片Mat srcImg = imread("test_face/group1.jpg");imshow("test", srcImg);//生成灰度图Mat grayImg;grayImg.create(srcImg.size(),srcImg.type());cvtColor(srcImg,grayImg,COLOR_BGR2GRAY);//人脸检测vector<Rect> faces;cascade.detectMultiScale(grayImg, faces, 1.1, 3, 0);//显示人脸框if (faces.size()) {cout << "人脸数量:" << faces.size() << endl;for (size_t i = 0; i < faces.size(); i++) {rectangle(srcImg, faces[i], Scalar(0, 0, 255), 3, 8, 0);}}else {cout << "未检测到人脸" << endl;}imshow("test_2", srcImg);waitKey(0);return 0;
}

测试结果

在这里插入图片描述


http://www.ppmy.cn/news/1062865.html

相关文章

代码随想录26|回溯总结

回溯总结:链接地址 回溯三部曲&#xff1a;参数、终止条件、for遍历(递归、回溯) 模板如下&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

es和数据库同步方案

5.5 课程信息索引同步 5.5.1 技术方案 通过向索引中添加课程信息最终实现了课程的搜索&#xff0c;我们发现课程信息是先保存在关系数据库中&#xff0c;而后再写入索引&#xff0c;这个过程是将关系数据中的数据同步到elasticsearch索引中的过程&#xff0c;可以简单成为索引…

MIA文献阅读 ——医学图像处理在慢性肾脏疾病评估中的最新进展【2021】

目录 0 摘要1 引言2 磁共振成像(MRI)2.1 扩散磁共振成像2.1.1 扩散加权成像(DWI)2.1.2 扩散张量成像(DTI) 2.2 血氧水平依赖成像2.3 动脉自旋标记2.4 动态对比增强磁共振成像2.5 T1和T2映射2.6 磁化转移磁共振成像2.7 磁共振弹性成像2.8 其他磁共振成像技术 3 其他成像方式3.1 …

windows安装多个版本node

1.下载nvm-setup版本 安装过程会检测到你当前使用的node版本 提示 Node v12.14.0 is already installed. Do you want NVM to control this version? 翻译&#xff1a;已安装节点v12.14.0。你想让NVM控制这个版本吗? 选择 是(Y)。 nvm默认为我们增添了环境变量&#xff0c;…

STM32F4X Systick系统滴答定时器

STM32F4X Systick系统滴答定时器 Systick定时器Systick使用Systick时钟源Systick寄存器Systick频率计算Systick例程 Systick定时器 在以Crotex-M4为架构的MCU中&#xff0c;都会有一个Systick内核定时器&#xff0c;这个定时器的作用可以给系统一个心跳时钟&#xff0c;通常用…

通过运行中的容器生成 Docker Compose 配置文件

背景 笔者之前有一次不小心删除了原始的 docker-compose.yml 文件&#xff0c;不过正在运行的 Docker 容器还在&#xff0c;找了许久&#xff0c;发现一个方法可以从这些容器中生成一个等效的 Docker Compose 配置文件。本文将介绍使用 autocompose 工具从正在运行的容器中反向…

Linux Shell 如何列举当前目录下的文件夹

如果只是想列举每个文件夹 那么就使用 ls -d */ 命令&#xff0c;因为 文件夹的名称都是以 / 结尾的 如果想要列出每个文件夹还有文件夹里包含什么文件等 那么就使用 ls */ 命令

GPU 错误中断处理程序(irq/82-nvidia)

irq/82-nvidia 中断请求&#xff08;IRQ&#xff09;是一种用于通知CPU有一个事件需要处理的机制&#xff0c;它可以由硬件设备或软件程序发出。 IRQ 82 是 NVIDIA 显卡设备的中断处理程序&#xff0c;这些错误中断信号表示GPU在执行相关的任务时遇到了一些问题&#xff0c;需…