牛骨文教育服务平台(让学习变的简单)

  大四暑假的时候,帮老师指导了一个本科大学生创新实验,主要目标是通过图像处理相关技术对人脸美丽度进行分类。其中一个很重要的环节就是人脸的性别识别,这里将这个部分单独拿出来,借住OpenCv这个开源的图像处理库,在MFC框架下编写了一个人脸性别识别的程序,本套教程将详细介绍编写过程。

  需要提前说的一点是这个程序是在大四的时候编写的,当时自己还没有正式的进行图像处理方面的研究,编程经验也不够丰富,因此程序只用了OpenCv提供的较为经典的人脸检测和人脸识别算法,在准确度、程序设计、异常机制处理上可能显得不够完善。在制作这套教程之前我并没有刻意去完善它,一是想好好审视下自己两年前的编程水平,二是保持程序的简洁性,使广大读者更容易看懂。教程编写完成后,我会再花些时间来完善自己当年这个处女作。

  一、程序效果演示

  首先给出程序的最终效果:

  从图中可以看出程序一共分为如下几个模块:方法选择、误差补偿及初始化模块;视频性别识别模块;图像性别识别模块;辅助功能;图片显示区域;结果显示区域。

  二、功能介绍

  1、方法选择、误差补偿及初始化模块

  这里一共有三个控件:初始化按钮,方法选择复选框,误差补偿值。初始化按钮与初始化事件相关联,主要是加载相关分类器(会在后面教程中详细介绍),这里的分类器主要包含一个人脸检测分类器以及三个性别识别分类器。单击初始化按钮,初始化完成后程序会给出对应提示:

  注意如果用户在尚未进行初始化的情况下进行其他操作,程序会弹出对话框提示用户先进行初始化:

  紧接着是方法选择列表,这里面提供了四种人脸性别识别的方法供用户选择,分别是PCA变换、Fisher变换、LBP变换、支持向量机:

  然后是误差补偿模块,用来补偿程序存在的一些固定误差,主要用在视频性别识别中,会在以后的教程中详细介绍。这里同样以一个列表控件的形式供用户选择:

  2、视频性别识别模块

  这个模块主要实现视频信号的性别识别,默认由摄像头采集视频。主要包含两个按钮,一个是开始按钮“打开视频”,另一个是暂停按钮。功能很简单,单击“打开视频”按钮,程序会自动检测当前设备上所安装的摄像头,并调用指定摄像头采集视屏,同时对视频进行人脸检测、性别识别,在图片显示区域显示实时的人脸检测结果,在结果显示区域显示性别识别结果。

  这里注意的是模块中的暂停按钮具有复用功能。因为这个程序具有两个功能,对摄像头视频进行性别识别以及对单张图片进行性别识别。当程序在处理视频是,这个按钮的功能是暂停/恢复当前视频;在对单张图片进行性别识别时,这个按钮的功能是自动读取文件夹下的下一张图片。在视频处理时按钮的状态为:

  在识别单张图片时按钮的状态为:

  3、单张图像性别识别模块

  这里同样包含两个按钮,一个“图片文件夹”按钮(这个按钮同样具有复用功能),一个静态文本框区域,注意着两个控件是相互关联的。在对图片进行性别识别时,程序提供了两个工作模式:

  模式一:选定一个文件夹,通过视频性别识别模块中的“下一张”按钮自动加载文件夹下所有图片,无需重复选择。

  模式二:直接选择一个图片文件进行操作。

  程序初始默认为模式一,即文件夹模式。此时单击模块中的“图像文件夹”按钮,将会弹出对话框,提示我们选择一个文件夹:

  我们在“双击此处转换模式”的静态文本框区域双击鼠标,将会切换到模式二:

  此时按钮的文本变为“图片文件”,单击会打开一个对话框要求用户具体选择一张图片来进行处理:

  注意这里两个模式下所弹出的文件对话框是不同的。再次双击可切换回原来的模式。

  4、辅助功能模块

  这部分模块中主要包含三个按钮:人脸批量分割、文件名修改、方法验证。

  这些都是我在编写程序的过程中用到的一些辅助性功能。单击“人脸批量分割”按钮,会弹出一个文件选择对话框,提示用户选择一个文件夹,然后程序会自动检测文件夹下的所有图片文件,对其进行人脸检测,并将检测到的人脸区域图片批量保存到程序制定路径下。同样,如果单击“文件名修改”按钮,同样会弹出一个对话框,提示用户选择文件夹,然后程序会对所有图片的名称按照指定格式进行统一修改,并保存。至于“方法验证”按钮,是一个测试按钮,主要是在开发程序的过程中用作调试按钮。

  5、图片显示区域和结果显示区域

  主要由一个picture控件和三个编辑框组成,用来显示当前的图像信息以及识别结果。其中“男/女识别率”这两个控件是用来在仿真试验中测试识别方法的效果的,将会在后续章节进行详细介绍。

  三、小结

  本篇教程主要介绍了程序的最终效果,让大家对本教程的最终目的有一个大致的了解。最后再次强调,这个程序是我本科阶段编写的,肯定会有很多不足之处,在处理图像时也用的都是经典算法。如果你希望从教程中了解人脸检测、人脸识别等方面最前沿的算法,那这篇教程可能会让你失望。但如果你希望了解MFC的入门级编程方法、图像处理的基本知识以及OpenCv的基本应用,相信你能从这套教程中学到一些东西。