在上一篇博客中我们已经绘制了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. C++友元函数和运算符重载

    非成员友元函数.成员友元函数和友元类 1.友元的作用: (1)友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行了数据共享的机制: 2.友元的优点和缺点 优点:提高程序的运行效率: 缺点: ...

  2. postman使用--接口的关联

    前戏 在实际接口测试过程中,接口经常会有关联,比如需要取上一个接口的返回值,然后作为参数传递给下一个接口作为参数,假设我们要获取A接口返回的userid值作为B接口的请求参数 先设置环境,所有接口在一 ...

  3. m3u8 格式转MP4

    现在很多视频网站采用HLS流媒体的方式来提供视频直播,在HTML源代码中flash的播放地址为 http://xxxxxx/video/movie.m3u8 1.m3u8下载的格式大致如下: #EXT ...

  4. 纯html+css中实现静态选座位效果技巧(input+label使用小技巧)

    很多时候,我们想通过html+css的方式实现排列在后方的代码在选中状态下,能控制排列在前的代码的样式.那么要怎么实现呢?在这里我就要用1个小技巧来完成. 众所周知的,我们css中的选择器通常只能向下 ...

  5. [LUOGU] P3004 [USACO10DEC]宝箱Treasure Chest

    第一眼:区间DP,可以瞎搞 f[i][j]=max(sum(i,j)-f[i+1][j],sum(i,j)-f[i][j-1]) 提出来就是f[i][j]=sum(i,j)-min(f[i+1][j] ...

  6. MySQL中的事务日志

    一.事务日志的作用 事务日志在保证事务的特性的同时,提高事务的执行效率 二.事务日志的工作原理 使用事务日志时,存储引擎修改了表的数据时只需要修改其内存拷贝. 然后再将修改行为记录到持久在硬盘上的事务 ...

  7. (13) openssl ca(签署和自建CA)

    用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...

  8. 算法导论 第六章 堆排序(python)

    6.1堆 卫星数据:一个带排序的的数通常是有一个称为记录的数据集组成的,每一个记录有一个关键字key,记录的其他数据称为卫星数据. 原地排序:在排序输入数组时,只有常数个元素被存放到数组以外的空间中去 ...

  9. 03003_Http响应

    1.Http协议 (1)状态码: (2)常用的状态码如下: 200 :请求成功: 302 :请求重定向: 304 :请求资源没有改变,访问本地缓存: 404 :请求资源不存在.通常是用户路径编写错误, ...

  10. 【06】Firebug记录Javascript日志

    Firebug记录Javascript日志 你可以使用Firebug来生成日志. 这有助于我们调试web页面并发现页面的错误. 在Firefox浏览器中执行以下代码: <!DOCTYPE HTM ...