C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数

2024-08-28 18:18

本文主要是介绍C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  这个项目主要包含三部分:人脸检测、特征提取、性别分类:

  这篇博客中我们重点介绍OpenCv的人脸检测函数。这篇博客我们先不提MFC,而是在win32控制台下编写一段人脸检测的程序。

  一、开启摄像头

  我们先讲解如何通过摄像头来采集图像,这听起来更有实际意义。

  1、新建工程并配置OpenCv(注意工程类型选择win32控制台应用程序):

  2、包含头文件

  OpenCv2.x版本包含头文件非常方便,一句话搞定:

#include <opencv2\opencv.hpp>using namespace cv;
using namespace std;

  谈到包含头文件,这里有一个地方需要详细说一下,就是OpenCv2.x之所以操作简洁,是因为其将各个模块的头文件全部置于“opencv.hpp”这个文件中了,右键打开opencv.hpp文档,你会发现如下内容:

  3、初始化一个摄像头捕捉器

  首先,需要建立一个摄像头捕捉器,并将其与当前设备中的摄像头相关联:

    /***********初始化一个摄像头捕捉器***********/CvCapture* capture = cvCreateCameraCapture(0);cvNamedWindow("Camera");

  注意以"cv"开头的结构体和函数名都是隶属于OpenCv1.x版本中的内容,不过OpenCv2.x是完全兼容1.x版本的,而且貌似在2.x版本并未对摄像头相关函数进行重写,因此这里暂且延用1.x中的代码。

  4、调用摄像头步骤画面并显示

  首先,给出代码,稍后解释:

    IplImage* cameraImage = NULL;while ((cameraImage = cvQueryFrame(capture)) != NULL){cvShowImage("Camera",cameraImage);cvWaitKey(1);}

  显然cvQueryFrame()函数的作用是在当前的时间点从摄像头抓取的视频流中截出一帧,这里将其赋值给变量camearImage(IplImage*类型,因为这是1.0的代码),若其非空,则显示在屏幕上。注意这里必须添加延时函数cvWaitKey(单位是毫秒),哪怕只延时一毫秒否则将无法正常显示摄像头输出。

  按下Ctrl+F5,程序正常运行:

  二、人脸检测

  OpenCv2.x版本中封装的人脸检测函数基于AdaBoost(级联分类器)人脸检测算法,当然这里我们无需深入了解算法相关的知识,因为Intel已经将需要用到的、训练好的人脸检测器(分类器)放在了安装文件里:

  1、准备工作

  调用人脸检测函数前需要做一些准备工作,分别是初始化所需内存、初始化检测器指针、设置检测器路径:

static CvMemStorage* storage            = NULL;
static CvHaarClassifierCascade* cascade = NULL;
const char* cascadePath                 = "D:\\opencv\\sources\\data\
\\haarcascades\\haarcascade_frontalface_alt_tree.xml";

  这里有两个问题需要强调:

  (1)从路径中可以看出,检测器位于安装目录下的source文件夹下的data文件夹下的haarcascades文件夹中。

  (2)在C++表示路径是要用双斜杠,因为第一个斜杠会默认为是转义字符,对第二个斜杠进行转义。

  (3)这三个变量均为全局变量。

  2、图像灰度化

  由于这里用到的人脸检测函数主要针对于灰度图像,因此需要将摄像头采集的彩色图像灰度化:

        /**********灰度化***********/IplImage* grayImage = cvCreateImage(cvSize(cameraImage->width,cameraImage->height),8,1);cvCvtColor(cameraImage,grayImage,CV_BGR2GRAY);

  这里涉及到如何通过cvCreatImage创建一个空的8位无符号整型单通道图,即需要通过一个cvSize结构体来指定图像初始的尺寸,这点在opencv2.x得到了很大改良(Mat类的加入)。

  3、调用人脸检测函数

  首先,创建一块内存区域,并加载相应的检测器(这个在主循环外完成即可):

    storage = cvCreateMemStorage(0);cascade = (CvHaarClassifierCascade*)cvLoad(cascadePath);

  然后,清空指定位置内存块,调用人脸检测函数:

        /**********人脸检测***********/cvClearMemStorage(storage);CvSeq* objects = cvHaarDetectObjects(grayImage,cascade,storage,1.1,2,0,cvSize(30,30));

  cvhaardetectobjects函数的参数较为复杂,具体参数设置参见:cvhaardetectobjects参数设置。我们这里需要了解的就是这个函数的返回参数是一系列检测结果序列,每个检测结果实际上就是一个矩形结构体对象。

  4、绘制人脸区域矩形框

  接下来一一绘制检测到的矩形结果:

        /**********绘制检测结果***********/for (int i = 0; i < (objects ? objects->total : 0); i++){CvRect* rect = (CvRect*)cvGetSeqElem(objects,i);cvRectangle(cameraImage,cvPoint(rect->x,rect->y),cvPoint(rect->x + rect->width,rect->y + rect->height),cvScalar(0.0,255));}cvShowImage("Camera",cameraImage);

  注意这里需要把之前测试摄像头程序中的图片显示语句注释掉,否则前后在显示图像时会发生覆盖,不能正常看到图像的检测结果:

  5、总程序

  这里给出摄像头人脸检测的总程序:

// Camera.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2\opencv.hpp>using namespace cv;
using namespace std;static CvMemStorage* storage            = NULL;
static CvHaarClassifierCascade* cascade = NULL;
const char* cascadePath                 = "D:\\opencv\\sources\\data\
\\haarcascades\\haarcascade_frontalface_alt_tree.xml";int _tmain(int argc, _TCHAR* argv[])
{/***********初始化一个摄像头捕捉器***********/CvCapture* capture = cvCreateCameraCapture(0);cvNamedWindow("Camera");/***********初始化人脸检测相关变量***********/IplImage* cameraImage = NULL;storage = cvCreateMemStorage(0);cascade = (CvHaarClassifierCascade*)cvLoad(cascadePath);while ((cameraImage = cvQueryFrame(capture)) != NULL){//cvShowImage("Camera",cameraImage);cvWaitKey(1);/**********灰度化***********/IplImage* grayImage = cvCreateImage(cvSize(cameraImage->width,cameraImage->height),8,1);cvCvtColor(cameraImage,grayImage,CV_BGR2GRAY);/**********人脸检测***********/cvClearMemStorage(storage);CvSeq* objects = cvHaarDetectObjects(grayImage,cascade,storage,1.1,2,0,cvSize(30,30));/**********绘制检测结果***********/for (int i = 0; i < (objects ? objects->total : 0); i++){CvRect* rect = (CvRect*)cvGetSeqElem(objects,i);cvRectangle(cameraImage,cvPoint(rect->x,rect->y),cvPoint(rect->x + rect->width,rect->y + rect->height),cvScalar(0.0,255));}cvShowImage("Camera",cameraImage);}return 0;
}

 

这篇关于C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115522

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设