C++开发人脸性别识别教程(11)——图片人脸检测程序BUG处理

  在这篇博客需要解决之前遗留的两个BUG,一是用户在不初始化条件下运行程序,二是人脸检测的误差结果。

  一、添加初始化警告

  目前我们在“初始化”按钮对应的响应函数中封装了人脸分类器加载、开辟内存等操作:

  因此,如果用户在未单击“初始化”按钮的情况下进行图片读入,人脸检测,程序就会因为缺少人脸检测器而崩溃,因此我们向CGenderRecognitionMFCDlg类中添加一个布尔类型的标志位用于指示当前用户是否完成了初始化操作:

  并在CGenderRecognitionMFCDlg类的构造函数中将其初始化为false(正常情况下VS会自动完整这个操作):

  接下来,在“初始化”按钮对应的响应函数中,将这个标志位置为true,代表初始化已经完成:

  接下来在“打开文件夹”按钮对应的响应函数的开头,添加标志位判断代码:

  此时,如果用户在未初始化时点击了“图像文件夹”按钮,程序会弹出对话框,提示用户先进行初始化操作:

  二、人脸检测优化

  在之前的程序中,人脸检测所返回的矩形不止一个,也就意味着存在检测误差。这里我们添加人脸检测的结果筛选代码,即根据检测结果矩形的面积进行筛选,只保留最大面积的矩形作为人脸检测的结果。这里需要对成员函数detect_and_draw()进行一些修改。

  1、计算矩形面积

  在人脸检测完成后,轮询检测结果序列,计算矩形面积,并保留面积最大的矩形标号:

    /**********对检测出的人脸区域面积做比较,选取其中的最大矩形**********/
    int maxface_label = 0;                    //最大面积人脸标签
    vector<int> max_face;                     //候选矩形面积
    for(int i = 0;i< objects->total;i++)
    {
        CvRect* r = (CvRect*)cvGetSeqElem(objects,i);
        max_face[i] = (float)r->height*r->width/100;
        if(i > 0&&max_face[i] > max_face[i-1])
        {
            maxface_label = i;
        }

    }

  然后更改结果显示部分的代码,只绘制最大面积的矩形:

    /**********绘制检测结果**********/
    if(objects->total > 0)                    //如果人脸检测成功
    {
            CvRect* rect = (CvRect*)cvGetSeqElem(objects,maxface_label);
            cvRectangle(img,cvPoint(rect->x,rect->y),
                cvPoint(rect->x + rect->width,rect->y + rect->height),cvScalar(0.0,255));
    }

  大功告成。

  

时间: 2024-10-06 05:06:11

C++开发人脸性别识别教程(11)——图片人脸检测程序BUG处理的相关文章

C++开发人脸性别识别教程(13)——针对单张图片的性别识别

在之前的博文中我们的性别识别程序已经初步成型,能够识别某个文件夹下的图片文件.不过这里有一个问题,假设这个文件夹下有着大量的图片,而我们希望识别这些图片中的某一张,此时需要我们不停的单击“下一张”按钮才会轮询到对应的图片,这是相当麻烦的,因此在这篇博客中我们向程序中添加一个功能——单张图片的性别识别. 一.基本思想 最基本的办法就是在主界面再添加一个按钮控件,命名为“图片文件”(之前的按钮为“图片文件夹”),不过这样会使得界面上的按钮控件过于繁多,给人一种“作者只会用button控件”的感觉.这

C++开发人脸性别识别教程(18)——辅助功能之文件名批量修改、方法验证

时光推移了30多天,这个人脸性别识别的小项目也接近尾声了,预计再通过三篇博文的篇幅来完成这个项目的收尾工作.在这篇博文中我们再为程序添加另外两个小的辅助功能:文件名批量修改.方法验证. 一 文件名批量修改 批量修改文件名是一件很基础也很常用的小操作,核心操作就是图像文件的批量读取.批量改名.批量保存.基本思想就是把文件读出来,然后在保存回去(注意不要和别的文件发生覆盖),从这个角度来讲文件名批量修改与上一篇博客C++开发人脸性别识别教程(17)——辅助功能之人脸批量分割中的人脸批量分割简直如出一

C++开发人脸性别识别教程(12)——添加性别识别功能

经过之前几篇博客的讲解,我们已经成功搭建了MFC应用框架,并实现了基本的图像显示和人脸检测程序,在这篇博文中我们要向其中添加性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行讲解,这里不再赘述,具体参见:C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别和C++开发人脸性别识别教程(6)——通过SVM实现性别识别. 一.分类器训练 在进行人脸性别识别之前需要训练性别识别的分类器,而分类器的训练过程是相对耗时的(大约五分钟),因此这里我们采用离线训练

C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别

在之前的博客中已经解决了人脸检测的问题,我们计划在这篇博客中介绍人脸识别.性别识别方面的相关实现方法. 其实性别识别和人脸识别本质上是相似的,因为这里只是一个简单的MFC开发,主要工作并不在算法研究上,因此我们直接将性别识别视为一种特殊的人脸识别模式.人脸识别可能需要分为几十甚至上百个类(因为有几十甚至上百个人),而性别识别则是一种特殊的人脸识别——只有两个类. 一.基本工具 通过OpenCv进行性别识别的基本工具是FaceRecognizer.这是OpenCv2.x版本中的一个基本的人脸识别类

C++开发人脸性别识别教程(16)——视频人脸性别识别

在之前的博文中我们已经能够顺利驱动摄像头来采集源图像,在这篇博文中将正式为其加入性别识别的代码,实现摄像头视频的人脸性别识别. 一.人脸检测 在得到摄像头采集的源图像之后,首先要做的就是对其进行人脸检测,将人脸区域分割出来.这步相对来说比较简单,只需在定时器时间触发函数中加入人脸检测的代码即可,这里给出OnTimer()函数的整体代码: void CGenderRecognitionMFCDlg::OnTimer(UINT_PTR nIDEvent) { /***********人脸检测并识别*

(转)C++开发人脸性别识别教程(3)——OpenCv配置和ImageWatch插件介绍

原文地址:http://blog.csdn.net/u013088062/article/details/50435079 OpenCv是C++图像处理的重要工具,这个人脸性别识别的项目就是借助OpenCv进行开发的.虽然网上已经有了很多关于OpenCv的配置教程,但出于教程完整性考虑,这里还是用专门的一篇博客来介绍OpenCv的具体配置方法,同时也介绍一下OpenCv中的一个强有力的图像处理插件——ImageWatch. 由于这个程序是一年前写的,当时的OpenCv的最新版本为2.4.9(现在

C++开发人脸性别识别教程(6)——通过SVM实现性别识别

上一篇教程中我们介绍了怎样使用OpenCv封装的FaceRecognizer类实现简单的人脸性别识别,这里我们为大家提供第二种主要的性别识别手段--支持向量机(SVM). 支持向量机在解决二分类问题方面有着强大的威力(当然也能够解决多分类问题).性别识别是典型的二分类模式识别问题,因此非常适合用SVM进行处理,同一时候OpenCv又对SVM进行了非常好的封装,调用非常方便,因此我们在这个性别识别程序中考虑增加SVM方法. 在这里我们採用了HOG+SVM的模式来进行,即先提取图像的HOG特征.然后

(转)C++开发人脸性别识别教程(6)——通过SVM实现性别识别

原文地址:http://blog.csdn.net/u013088062/article/details/50480518 上一篇教程中我们介绍了如何使用OpenCv封装的FaceRecognizer类实现简单的人脸性别识别,这里我们为大家提供另外一种基本的性别识别手段——支持向量机(SVM). 支持向量机在解决二分类问题方面有着强大的威力(当然也可以解决多分类问题),性别识别是典型的二分类模式识别问题,因此很适合用SVM进行处理,同时OpenCv又对SVM进行了很好的封装,调用非常方便,因此我

C++开发人脸性别识别教程(3)——OpenCv配置和ImageWatch插件介绍

OpenCv是C++图像处理的重要工具.这个人脸性别识别的项目就是借助OpenCv进行开发的. 尽管网上已经有了非常多关于OpenCv的配置教程,但出于教程完整性考虑.这里还是用专门的一篇博客来介绍OpenCv的详细配置方法,同一时候也介绍一下OpenCv中的一个强有力的图像处理插件--ImageWatch. 因为这个程序是一年前写的.当时的OpenCv的最新版本号为2.4.9(如今已经更新到了3.0),而且2.4.9版本号和3.0版本号在配置方法上稍有不同,这里我仍以2.4.9版本号为例来介绍

C++开发人脸性别识别教程(17)——添加辅助功能

在之前的博文中已经将性别识别的部分叙述的基本完整,整个程序的开发也接近尾声,在这篇博文中我们再为程序添加三个小的辅助功能:人脸批量分割.文件名修改.方法验证. 一.人脸批量分割 在前面的博文中提到过,进行性别识别训练所用到的训练样本是分割好的男性样本和女性样本,那么如何去制作这些训练样本呢?这就需要进行人脸图像的批量人脸分割. 1.1 添加控件 首先添加一个“人脸批量分割”的按钮: