在上一篇博客中我们已经绘制了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基础一 day2 数据类型

    int:        bool: 类型转换: str到int有条件,str必须是数字, "123e"是错误的 bool转换为int类型,需要int(x)  结果:  结果: 空字 ...

  2. Gear Pump: Why Install A Pressure Reducing Valve?

    When the     Gear Pump Manufacturers    prompts to install a gear pump, the following points should ...

  3. vmware linux虚拟机与本地物理机共享文件夹

    cd /mnt/hgfs 使用Vmware安装了linux虚拟机后,开发时,为了方便文件的传输等,因此需要使用共享文件夹,减少工作量.共享文件夹需要用到vmware提供的vmware tools工具, ...

  4. docker-compose nginx

    docker-compose nginx example source code docker-compose nginx balancing

  5. java list去重操作实现方式

    Java中的List是可以包含重复元素的(hash code 和equals),接下来将介绍两种方式实现java list去重操作,感兴趣的朋友可以参考下   Java中的List是可以包含重复元素的 ...

  6. 【JDBC】Servlet实例

    import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.Dri ...

  7. git服务器端安装

    一.服务器端安装 git支持四种传输协议 1.本地协议 2.ssh协议 3.git协议 4.http/s协议 [root@zabbix ~]# cat /etc/redhat-release Cent ...

  8. 剑指Offer(书):矩阵中的路径

    题目: * 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.* 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.* 如果一条路径经 ...

  9. LeetCode 467. Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  10. hadoop格式化出错,提示IO异常

    配置好hadoop之后,在进行格式化的时候出现异常,原因是由于在core-site.xml 配置文件中写的路径格式不对. 不需要加 file:/ 或者 file:// 直接写绝对路径就行. <c ...