C++开发人脸性别识别教程(1)——前瞻

2024-08-28 18:18

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

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

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

  一、程序效果演示

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


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

  二、功能介绍

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

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

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

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

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

  2、视频性别识别模块

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

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

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

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

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

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

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

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

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

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

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

  4、辅助功能模块

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

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

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

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

  三、小结

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

 

 

        

 

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


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1115519

相关文章

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat