【OpenCV入门指南】第十三篇 人脸检测

使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测 这篇博客将介绍如何使用预训练好的OpenCV Haar级联人脸、眼睛、嘴部检测器,并将它们应用于实时视频流。 人脸检测结果是最稳定和准确的。不幸的是,在许多情况下,眼睛检测和嘴巴检测结果是不可用的——对于面部特征/部分提取,强烈建议[使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌](https://blog.youkuaiyun.com/qq_40985985/article/details/106136330),dlib的检测要比眼睛Haar级联,嘴巴Haar级联本身更稳定,甚至更快。 阅读详情
AI摘要

本文详细介绍如何使用OpenCV进行人脸检测,并提供了从加载Haar特征分类器到图像处理及人脸标记的完整示例代码。此外,还展示了不同场景下的人脸识别效果。

【OpenCV入门指南】第十三篇 人脸检测 

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让很多公司纷纷关注,很多公司都拥有这方面的专利或是开发商业产品出售。

    在OpenCV中,人脸检测也是其热门应用之一。在OpenCV的特征检测专题就详细介绍了人脸检测的原理——通过Haar特征来识别是否为人脸。Haar特征检测原理与Haar特征分类器的训练放到下一篇《【OpenCV入门指南】第十四篇  Haartraining》来讲,本篇主要介绍如何在OpenCV中使用Haar特征分类器来对图像中的人脸进行检测和识别。下面将分成五步来详细示范如何在OpenCV中进行人脸识别:

    一.人脸的Haar特征分类器是什么

    二.在哪找人脸的Haar特征分类器

    三.怎么用人脸的Haar特征分类器

    四.人脸识别示例代码

    五.人脸识别程序运行结果

 

一.人脸的Haar特征分类器是什么

人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。

 

二.在哪找人脸的Haar特征分类器

OpenCV有已经自带了人脸的Haar特征分类器。OpenCV安装目录中的\data\ haarcascades目录下的haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是用来检测人脸的Haar分类器。这个haarcascades目录下还有人的全身,眼睛,嘴唇的Haar分类器。读者可以仿照本方的例子来试验下效果看看。

 

三.怎么用人脸的Haar特征分类器

使用人脸的Haar特征分类器非常之简单,直接使用cvHaarDetectObjects。下面来看看这个函数的介绍:

函数功能:检测图像中的目录

函数原型:

CVAPI(CvSeq*) cvHaarDetectObjects(

  const CvArr* image,

  CvHaarClassifierCascade* cascade,

  CvMemStorage* storage,

  double scale_factor CV_DEFAULT(1.1),

  int min_neighbors CV_DEFAULT(3),

  int flags CV_DEFAULT(0),

  CvSize min_size CV_DEFAULT(cvSize(0,0)),

  CvSize max_size CV_DEFAULT(cvSize(0,0))

);

函数说明:

第一个参数表示输入图像,尽量使用灰度图以加快检测速度。

第二个参数表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。

第三个参数为CvMemStorage类型,大家应该很熟悉这个CvMemStorage类型了,《OpenCV入门指南》中很多文章都介绍过了。

第四个参数表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%

第五个参数表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。

第六个参数要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。

第七个,第八个参数表示检测窗口的最小值和最大值,一般设置为默认即可。

函数返回值:

函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。

 

四.人脸识别示例代码

下面给出一个完整的示例代码,代码中的GetTickCount可以参阅《Windows 各种计时函数总结》,cvEqualizeHist可以参阅《【OpenCV入门指南】第八篇灰度直方图》。

// 编译前请配置好VS2008的编译环境
// 详见《【OpenCV入门指南】第一篇 安装OpenCV》
// 地址: http://blog.youkuaiyun.com/morewindows/article/details/8225783

// 本文配套博客文章地址:
// http://blog.youkuaiyun.com/morewindows/article/details/8426318

// Haar特征检测 - 人脸识别
//By MoreWindows (http://blog.youkuaiyun.com/MoreWindows)
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
using namespace std;
int main()
{
	// 加载Haar特征检测分类器
	// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
	const char *pstrCascadeFileName = "G:\\OpenCV\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
	CvHaarClassifierCascade *pHaarCascade = NULL;
	pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);

	// 载入图像
	const char *pstrImageName = "101.jpg";
	IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
	
	IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
	cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);

	// 人脸识别与标记
	if (pHaarCascade != NULL)
	{		
		CvScalar FaceCirclecolors[] = 
		{
			{{0, 0, 255}},
			{{0, 128, 255}},
			{{0, 255, 255}},
			{{0, 255, 0}},
			{{255, 128, 0}},
			{{255, 255, 0}},
			{{255, 0, 0}},
			{{255, 0, 255}}
		};

		CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
		cvClearMemStorage(pcvMStorage);
		// 识别
		DWORD dwTimeBegin, dwTimeEnd;
		dwTimeBegin = GetTickCount();
		CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
		dwTimeEnd = GetTickCount();

		printf("人脸个数: %d   识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
		
		// 标记
		for(int i = 0; i <pcvSeqFaces->total; i++)
		{
			CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
			CvPoint center;
			int radius;
			center.x = cvRound((r->x + r->width * 0.5));
			center.y = cvRound((r->y + r->height * 0.5));
			radius = cvRound((r->width + r->height) * 0.25);
			cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
		}
		cvReleaseMemStorage(&pcvMStorage);
	}
	
	const char *pstrWindowsTitle = "人脸识别 (http://blog.youkuaiyun.com/MoreWindows)";
	cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrWindowsTitle, pSrcImage);

	cvWaitKey(0);

	cvDestroyWindow(pstrWindowsTitle);
	cvReleaseImage(&pSrcImage);	
	cvReleaseImage(&pGrayImage);
	return 0;
}

五.人脸识别程序运行结果

运行结果一(单人正面):

这张图的干扰太少,换张干扰大点的图来试试。

 

运行结果二(单人侧面):

呵呵,左边那个人眼睛被挡住了,因此普通的人脸检测肯定难以识别的。

 

运行结果三(多人):

效果还不错。当然商业级产品的准确度,性能,效率肯定会比OpenCV自带的分类器高的多。

 

下一篇《【OpenCV入门指南】第十四篇  Haartraining》将介绍如何训练Haar特征分类器并简要介绍Haar特征检测的原理。欢迎继续浏览。

 

下面列出OpenCV入门指南系列目录,以方便大家查看:

1.《【OpenCV入门指南】第一篇安装OpenCV》

2.《【OpenCV入门指南】第二篇缩放图像》

3.《【OpenCV入门指南】第三篇Canny边缘检测》

4.《【OpenCV入门指南】第四篇图像的二值化》

5.《【OpenCV入门指南】第五篇轮廓检测上》

6.《【OpenCV入门指南】第六篇轮廓检测下》

7.《【OpenCV入门指南】第七篇线段检测与圆检测》

8.《【OpenCV入门指南】第八篇灰度直方图》

9.《【OpenCV入门指南】第九篇灰度直方图均衡化》

10.《【OpenCV入门指南】第十篇彩色直方图均衡化》

11.《【OpenCV入门指南】第十一篇鼠标绘图》

12.《【OpenCV入门指南】第十二篇无法运行OpenCV程序?》

13.《【OpenCV入门指南】第十三篇人脸识别》

14.《【OpenCV入门指南】第十四篇  Haartraining》即将发布

 

 

 


 

《OpenCV入门指南》系列文章地址:http://blog.youkuaiyun.com/morewindows/article/category/863841

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/8426318

欢迎关注微博:http://weibo.com/MoreWindows

haarcascade_frontalface_alt2.xml 人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。OpenCV有已经自带了人脸的Haar特征分类器。OpenCV安装目录中的\data\ haarcascades目录下的haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是用来检测人脸的Haar分类器。这个haarcascades目录下还有人的全身,眼睛,嘴唇的Haar分类器。关于人脸的Haar特征分类器,可以直接使用cvHaarDetectObjects。离线的人脸检测技术一般采用神经网络的方法,ColorReco就是用神经网络的思路做人脸识别的。 立即下载

相关推荐

haarcascade_frontalface_alt.xml分类器

正脸识别分类器

基于Opencv中的haarcascade_frontalface_alt.xml的人脸检测

使用Opencv中haarcascade_frontalface_alt.xml进行简单的人脸检测。

qq_63179559的博客 4995

一文介绍Linux EAS

EAS只在系统负载不重时,即系统中每个CPU的利用率都低于其算力的80%时才被启用,而且选出的最节能CPU只有比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。因此EAS为线程选择最节约能量的CPU来运行的前提条件是很苛刻的,针对重载场景(比如游戏),EAS的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。算力(capacity)是CPU调度中的一个基础概念,它反映的是一个CPU的计算能力,是个规格化的值,可以通过读取Android手机的文件节点。

youzhangjing_的博客 1234

OpenCV人脸识别文件haarcascade_frontalface_alt.xml

写python项目的时候,因为使用到人脸识别,需要下载OpenCV人脸识别模型haarcascade_frontalface_default.xml这个文件,网上找的网盘链接要么过期要么文件代码缺失一半,运行的时候报一堆错,排查后才发现。坑爹费时。 我上传的这个文件时间永久,自己用过可以使用,有问题网址掉了请私信我!! 1.网盘分享 链接:https://pan.baidu.com/s/1QbjQA5U0E_n9GYme0DZZmw?pwd=czhh 提取码:czhh .........

qq_56966336的博客 9570

基于互相关(NCC)模板匹配——find_ncc_model_defocused.hdev

相关性原理:仅在NCC(r,c) = ±1时,模板与图像完全匹配; NCC绝对值越大,表示模板与正在检测部分图像越接近; NCC绝对值越接近于零,表示模板与图像越不一致。 线性光照变化不会影响NCC计算结果。 重要函数一: 创建模板:create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID) 参数列表: Template(in):单通道灰度图像,它的区域可被创建为模板。 Num

m0_51271525的博客 3413

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2209

转载【OpenCV入门指南】第十三篇 人脸检测

【OpenCV入门指南】第十三篇 人脸检测  此为转载,原文链接:http://blog.youkuaiyun.com/morewindows/article/details/8426318     本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。

tiaodaochouqin的专栏 636

orangepi 5 plus ubuntu24.04上安装redroid

OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口

babytiger的专栏 2292
上一篇: Windows界面编程第五篇 静态控件背景透明化
下一篇: VC++获取屏幕大小第一篇 像素大小GetSystemMetrics
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 94
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值