做了两个月的图像分割,主要工具为:MFC(VS2010)、opencv2.3.1、ITK4.3.1、VTK5.8.0,现做如下知识性的总结
一、配置问题
1.opencv2.3.1 下载已编译的库,设置一下计算机的环境变量,然后直接在VS中包含一下库文件即可。
2.ITK和VTK使用CMake编译
二、程序(MFC)
1. 打开文件及文件夹,定制对话框
(1)打开文件对话框,获取选择项的路径 CFileDialog
CString filename;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,NULL,0,TRUE);
if(IDOK==dlg.DoModal())
{
filename=dlg.GetPathName();
}
(2)打开文件夹对话框
MFC中没有现成的类,需要定制文件夹对话框,封装函数如下:
CString GetFolderPath()
{
LPITEMIDLIST rootLoation;
SHGetSpecialFolderLocation( NULL, CSIDL_DESKTOP, &rootLoation );
//配置对话框
CString strPath = "";
BROWSEINFO bInfo;
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.lpszTitle = _T("请选择路径: ");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
bInfo.pidlRoot = rootLoation; // 文件夹对话框之根目录,不指定的话则为我的电脑
//显示对话框
LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL) //用户按了确定按钮
{
TCHAR chPath[255]; //用来存储路径的字符串
SHGetPathFromIDList(lpDlist, chPath);//把项目标识列表转化成字符串
strPath = chPath; //将TCHAR类型的字符串转换为CString类型的字符串
}
return strPath;
}
详解:
LPITEMIDLIST 表示ITEMIDLIST结构,而非指向ITEMIDLIST结构的指针。item id是一个结构体,它等价于文件或文件夹名称的功能,通常并不单独使用,而是
存在一个item id列表.
HRESULT SHGetSpecialFolderLocation( HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl ); 返回一个指向ITEMIDLIST结构的指针,存放于ppidl中
BROWSEINFO 包含SHBrowseForFolder()函数所需信息的结构体,并返回用户所选择的文件夹信息
SHBrowseForFolder(&bInfo)显示一个能使用户选择Shell文件夹的对话框,并返回ITEMIDLIST结构体指针
(3)定制自己的对话框
创建自己的对话框类,在对话框类中实现自己的函数。调用DoModal显示模态对话框,或另一个函数显示非模态对话框