在上一篇博客中我们已经绘制了MFC界面,在这篇博客中我们将加入响应代码,为MFC框架加入一个最主要的功能:打开一个目录。

  一、加入相关头文件

  这里头文件主要包括三类:opencv头文件、批量读取文件相关的头文件、CvvImage。这里须要强调CvvImage这个头文件,这个是用来关联OpenCv和picture控件,而且这个头文件是隶属于OpenCv1.x的,在2.x版本号中已经将这个类移除。因此须要手动下载这两个文件(CvvImage.h和CvvImage.cpp),下载地址:CvvImage。下载后将这两个文件放在project文件夹下:

  然后在VS的解决方式资源管理器窗体中,右击该project,在快捷菜单中选择“加入->现有项”:

  将这两个文件加入到当前project中:

  加入完毕后,能够在代码中加入响应的头文件了,建议将include命令加入在GenderRecognitionMFCDlg.h头文件里:

#include <iostream>
#include <sstream>
#include <fstream>
#include <opencv2\opencv.hpp>
#include "CvvImage.h" using namespace std;
using namespace cv;

  这里有两点须要强调:

  (1)#include语句包括两种形式,“ #include<> ”和“ #include“” ”。这两种格式的差别在于优先搜索路径的不同。“ #include<> ”默认优先依照系统路径进行搜索,“ #include“” ”默认优先搜索当前的project文件夹。

  (2)include语句的位置。大型project中的include语句要注意避免一个反复包括的问题,即要保证每条include语句仅仅运行一次,否则就会出现重定义类型的错误。C++提供两种机制来确保include语句运行的唯一性。一是通过“ifndef”宏来包围include代码块,二是通过“#pragma once”宏来实现,这里默认使用另外一种,因此全部的include语句应该位于“#pragma once”语句之后。

  二、加入控件响应函数

  因为读取显示图片的操作是通过“图像目录”button来控制的,因此须要为这个button加入响应的事件响应函数。方法很easy,在资源视图窗体中双击相应控件就可以,VS将自己主动加入响应函数:

  三、打开目录。读取图片路径

  接下来为OnBnClickedButtonImagefile()函数加入批量读取图片的代码。我们这里选用SHBrowseForFolder方法。关于这种方法我之前曾写过一篇博客来专门介绍,详细參见一种批量读取文件的方法——SHBrowseForFolder。注意一点,在SHBrowseForFolder方法中须要用到dir文件夹相关的操作函数(如opendir等),这算是Linux的移植版,因此须要借用dirent.h头文件,只是我们已经在之前下载的资源中提供了这个文件,仅仅需根据之前CvvImage文件的配置方法,加入到当前project中就可以:

  接下来,向CGenderRecognitionMFCDlg类中加入若干成员变量,用以记录读取的文件夹以及文件的路径及属性,详细须要加入下面四个成员变量,各自是CString m_Path(图像文件路径)、char* m_ImageDir(文件结构)、DIR *m_pDir(文件夹结构)、struct dirent *m_pEnt(文件夹结构)。这里以m_pEnt为例。介绍VS中加入类成员变量的方法。

在类视图中,右击CGenderRecognitionMFCDlg类。在快捷菜单中选择“加入->加入变量”:

  在弹出的向导窗体中。指定变量的属性。然后单击“完毕”button:

  同理,加入其它三个成员变量(注意变量类型):

  变量加入完毕后,就可以向OnBnClickedButtonImagefile()函数中加入对应代码:

    /**********初始化变量**********/
CString str; //存储图像路径
BROWSEINFO bi; //用来存储用户选中的文件夹信息
TCHAR name[MAX_PATH]; //存储路径
ZeroMemory(&bi,sizeof(BROWSEINFO)); //清空文件夹相应的内存
bi.hwndOwner = GetSafeHwnd(); //得到窗体句柄
bi.pszDisplayName = name; /**********设置对话框并读取文件夹信息**********/
BIF_BROWSEINCLUDEFILES;
bi.lpszTitle = _T("Select folder"); //对话框标题
bi.ulFlags = 0x80; //设置对话框形式
LPITEMIDLIST idl = SHBrowseForFolder(&bi); //返回所选中文件夹的ID
SHGetPathFromIDList(idl,str.GetBuffer(MAX_PATH)); //将文件信息格式化存储到相应缓冲区中
str.ReleaseBuffer(); //与GerBuffer配合使用,清空内存
m_Path=str; //将路径存储在m_path中
if(str.GetAt(str.GetLength()-1)!='\\')
m_Path += "\\";
UpdateData(FALSE); IMalloc * imalloc = 0;
if (SUCCEEDED(SHGetMalloc(&imalloc)))
{
imalloc->Free (idl);
imalloc->Release();
} /**********获取该路径下的第一个文件**********/
m_ImageDir = (LPSTR)(LPCTSTR)m_Path;
m_pDir = opendir(m_ImageDir);
for (int i = 0; i < 1; i ++) //过滤文件夹 .. 和 .
{
m_pEnt = readdir(m_pDir);
}

  有关SHBrowseForFolder的方法介绍,除了之前给出的那篇博客之外,这里再推荐两篇更为具体的博客:文件夹浏览(SHBrowseForFolder)以及使用SHBrowseForFolder函数打开文件文件夹对话框

  四、简单调试

  完毕上面那段代码之后,进行一下简单调试。首先按下F7对project进行编译,在编译过程中注意将调试器版本号设置为X64(64位)。编译通过后,设置断点,按下F5进行调试执行。此时单击“图像目录”button,将弹出打开目录对话框:

  选择一个目录,然后查看各个变量的情况:

  可见。m_Path保存了当前选择的目录路径。

在下一篇博文中我们将通过这个变量来完毕相应目录目录下图像文件的遍历和显示。

C++开发人脸性别识别教程(8)——搭建MFC框架之读取目录信息的更多相关文章

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

    经过之前几篇博客的解说,我们已经成功搭建了MFC应用框架,并实现了主要的图像显示和人脸检測程序,在这篇博文中我们要向当中加入性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行解说.这里 ...

  2. C++开发人脸性别识别教程(19)——界面美化

    在这篇博文中将完毕<C++开发人脸性别识别>的收尾工作.主要内容分为两部分:加入视频暂定功能.界面规范化. 一 视频暂停功能 严格来说这个视频暂定功能算是视频人脸性别识别的一个遗留问题,本 ...

  3. C++开发人脸性别识别教程(10)——加入图片的人脸检測程序

    现在我们的MFC框架已经初具规模,能够读取并显示目录下的图片.在这篇博文中我们将向当中加入人脸检測的程序. 一.人脸检測算法 这里我们使用OpenCv封装的Adaboost方法来进行人脸检測,參见:C ...

  4. C++开发人脸性别识别教程(9)——搭建MFC框架之显示图片

    在之前的博客中我们已经实现读取用户选定的目录.并将其路径保存在对应的变量中.在这篇博文中我们将介绍怎样借助CvvImage类将图片显示在picture控件中,并自己主动读取目录下的其它图片. 一.加入 ...

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

    OpenCv是C++图像处理的重要工具.这个人脸性别识别的项目就是借助OpenCv进行开发的. 尽管网上已经有了非常多关于OpenCv的配置教程,但出于教程完整性考虑.这里还是用专门的一篇博客来介绍O ...

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

    在之前的博文中我们已经可以顺利驱动摄像头来採集源图像.在这篇博文中将正式为其加入性别识别的代码,实现摄像头视频的人脸性别识别. 一.人脸检測 在得到摄像头採集的源图像之后,首先要做的就是对其进行人脸检 ...

  7. C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制

    在之前的博客中我们已经将项目中用到的算法表述完成,包含人脸检測算法以及四种性别识别算法,在这篇博客中我们将着手搭建主要的MFC框架. 一.框架概况 在这篇博文中我们将搭建最主要的MFC框架.绘制MFC ...

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

    在之前的博客中已经攻克了人脸检測的问题,我们计划在这篇博客中介绍人脸识别.性别识别方面的相关实现方法. 事实上性别识别和人脸识别本质上是相似的,由于这里仅仅是一个简单的MFC开发,主要工作并不在算法研 ...

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

    http://blog.csdn.net/u013088062/article/details/50480518

随机推荐

  1. Hbase数据库简介

    Hbase是基于Hadoop下分布式存储 数据库,列式存储.(https://www.imooc.com/video/17202) 动态的增加列,不像关系数据库需要提前定义好列. 关系数据库     ...

  2. C++静态全局变量和全局变量的区别

      静态全局变量 非静态全局变量 存储方式 静态存储 静态存储 作用域 定义该变量的源文件内 所有源文件 解释: 共同点:全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量.全 ...

  3. java生成随机字符

    1.生成的字符串每个位置都有可能是str中的一个字母或数字,需要导入的包是import java.util.Random; //length用户要求产生字符串的长度 public static Str ...

  4. fossil 使用

    ~$ fossil updateCannot figure out who you are! Consider using the --usercommand line option, setting ...

  5. 教你学会Linux/Unix下的vi文本编辑器

    vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结. 首先,记住vi编辑器的两个模式:1.命令模式 2.编辑模式. 在一个UNIX/Linux的s ...

  6. C# 关于datetime的用法(网上考的)

    实例: 用户输入一个日期,要求输出这个日期是星期几和在这一年中的第几天: 复制代码代码如下: //声明一个DateTime类型的变量用于存放用户输入的日期DateTime dt;Console.Wri ...

  7. Manjaro/Arch linux 安装输入法

    输入命令: sudo pacman -Syu fcitx fcitx-googlepinyin fcitx-im fcitx-configtool 编辑 ~/.xprofile:# xfcitxexp ...

  8. Python自动化测试框架——生成测试报告

    如何才能让用例自动运行完之后,生成一张直观可看易懂的测试报告呢? 小编使用的是unittest的一个扩展HTMLTestRunner 环境准备 使用之前,我们需要下载HTMLTestRunner.py ...

  9. kvm客户机存储方式

    前面介绍了存储的配置和qemu-img工具来管理镜像,在QEMU/KVM中,客户机镜像文件可以由很多种方式来构建,其中几种如下: 1) 本地存储的客户机镜像文件. 2) 物理磁盘或磁盘分区. 3) L ...

  10. 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)

    NOTE : 1.尽可能延后变量定义式的出现时间.这样做可增加程序的清晰度并改善程序效率.