在上一篇博客中我们已经绘制了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. python:第一章

    完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. 代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要1 ...

  2. Win10任务栏搜索框无法搜索,显示白色页面

    如果确定: Windows search服务启动打开 %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\Local ...

  3. No-10.高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  4. 数组合并--php

    常用的合并数组方法有以下几种: 1  array_merge 2  '+' 3  array_merge_recursive 下面是一段对比的代码 $array1 = array(2,4," ...

  5. Linux基础测试

    目 录 第1章 文件及目录课后作业    1 第2章 Linux打包与压缩习题    1 第3章 Linux系统VIM编辑器习题    1   文件及目录课后作业 从/proc/meminfo中过滤出 ...

  6. LeetCode(69) Sqrt(x)

    题目 Total Accepted: 67411 Total Submissions: 286086 Difficulty: Medium Implement int sqrt(int x). Com ...

  7. c++ 高精度 加减乘除 四则运算 代码实现

    很久以前写的啦 记得写了好久好久一直卡在特例的数据上面 想起都心塞 那时候变量和数组的取名对我来说简直是个大难题啊 完全乱来 abcdef就一路排下来 自己看的时候都搞不懂分别代表什么 好在后来英语学 ...

  8. 【01】sass基础信息:

    [01]基础信息:   2016年4月16日   最新版本:3.4.22   官网:http://sass-lang.com/(下图)       CSStoSCSS 网站:http://css2sa ...

  9. AI学习笔记(01)

    [1]在Ai中,每个对象有两个属性:填充颜色和描边颜色.   [2]在AI中,非要选中,才操作.而PS中,选中图层即可.   [3]AI中,都是路径.   [4]选择工具是选中整个路径,而直接选择工具 ...

  10. 【ITOO 4】WCF中,分布式事务处理

    导读:事务可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.在项目中,就有 ...