mfc常用的代码更新

Posted BHY_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc常用的代码更新相关的知识,希望对你有一定的参考价值。

获取文件夹目录

#define BIF_NEWDIALOGSTYLE 0x0040
void CFontConvertDlg::OnBnClickedDecgen()    

	HWND hwnd= GetSafeHwnd();   //得到窗口句柄
	CString filePath= _T(""); //得到文件路径 
	LPMALLOC pMalloc;
	BOOL flag;
	if (::SHGetMalloc(&pMalloc) == NOERROR) //取得IMalloc分配器接口
	   
		BROWSEINFO bi;
		TCHAR pszBuffer[MAX_PATH];
		LPITEMIDLIST pidl;   
		bi.hwndOwner = hwnd;
		bi.pidlRoot = NULL;
		bi.pszDisplayName = pszBuffer;
		bi.lpszTitle = _T("选择文件夹"); //选择目录对话框的上部分的标题
		//添加新建文件夹按钮 BIF_NEWDIALOGSTYLE
		bi.ulFlags =  BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS;
		bi.lpfn = NULL;
		bi.lParam = 0;
		bi.iImage = 0;
		if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)  //取得IMalloc分配器接口
		   
			if (::SHGetPathFromIDList(pidl, pszBuffer)) //获得一个文件系统路径
			
				filePath = pszBuffer;
			
			pMalloc->Free(pidl); //释放内存
			m_FilePath = filePath;
			flag = TRUE;
			//MessageBox(filePath);
		
		pMalloc->Release(); //释放接口
	

 

创建文件夹

头文件#include <direct.h>

代码   _mkdir("book");

 

统计代码行数

 

按CTRL+SHIFT+F (Find in files),勾上支持正则表达式,然后输入搜索内容:

^:b*[^:b#/]+.*$

以上表达式的统计可做到:#开头和/开头或者空行都不计入代码量。如果需要只统计代码文件的代码量,可以选择查找文件的类型,比如什么*.xml, *.resx….可以不检查,只查*.cs,*.c,*.h…

搜索出来以后最后一行就是代码行数了。

 

 

 

选择文件对话框

// 设置过滤器   
    TCHAR szFilter[] = _T("|所有文件(*.*)|*.*||");   
    // 构造打开文件对话框   
    CFileDialog fileDlg(TRUE, _T(""), NULL, 0, szFilter, this);   
    CString strFilePath;   

    // 显示打开文件对话框   
    if (IDOK == fileDlg.DoModal())   
       
        // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
        strFilePath = fileDlg.GetPathName();   
        //SetDlgItemText(IDC_OPEN_EDIT, strFilePath);   
       

 

imwrite函数

第一个参数:const string&类型的filename,设置为需要写入的文件名就行了(包含后缀)。

第二个参数:InputArray类型的img,一般是一个Mat类型的图像数据。

第三个参数:const std::vector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值std::vector<int>(),所以一般情况下不需要填写。如果更改的话,对于不同的图片格式,其对应的值不同功能不同,如下:


对于JPEG格式的图片,这个参数表示从0-100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.

对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0-9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.

对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.

 

vector<int>compression_params;    

compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //PNG格式图片的压缩级别    

compression_params.push_back(9);    

try



imwrite("透明Alpha值图.png", mat, compression_params);    

    

catch (runtime_error& ex)    

    

fprintf(stderr, "图像转换成PNG格式发生错误:%s\\n", ex.what());    

return 1;   

    

 

 

opencv全屏显示

 

#include <opencv/cv.h>  
#include <opencv/highgui.h>  
  
using namespace cv;  
using namespace std;  
  
int main()  
  
    Mat src = imread("E:/Material/Img/Heads/01.jpg",1);  
    imshow("src",src);  
    namedWindow("FullScreen",CV_WINDOW_NORMAL);  
    setWindowProperty("FullScreen", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );  
  
    //需要重新编译OpenCV Support Qt  
    //displayOverlay("FullScreen","overlay");  
    //displayStatusBar("FullScreen","statusBar",10);  
  
    imshow("FullScreen",src);  
    waitKey();  
  

 

 

 

opencv窗口大小改变显示图像

 

官网中内容,默认情况下,是1,自动调整窗口大小模式。如果在图片高清情况下,显示图片窗口很大,

电脑屏幕放不下,并且窗口还不能通过拖动鼠标来调整打下。Flags=0,是WINDOW_NORMAL

在这个模式下可以调整窗口的大小。分两类,像调节浏览器页边改变大小那样改变,和通过参数设置好大小。

第一中方法:1变成0即可。或者写成:WINDOW_NORMAL

namedWindow("窗口名",0);//创建窗口

imshow("窗口名",要显示的图片);//在创建的窗口中显示图片

第二种方法,加入一个新的函数:

namedWindow("窗口名",0);//创建窗口

cvResizeWindow("窗口名", 500, 500); //创建一个500*500大小的窗口

imshow("窗口名",要显示的图片);//在创建的窗口中显示图片

 

 

findContours函数的使用

 

#include "highgui.h"  
#include "imgproc/imgproc.hpp"  
  
int main()  
  
    cv::Mat image = cv::imread("D:/Development/OpenCV/images/binaryGroup.bmp" , 0) ;  
    std::vector<std::vector<cv::Point>> contours ;  
    //获取轮廓不包括轮廓内的轮廓  
    cv::findContours(image , contours ,   
        CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE) ;  
    cv::Mat result(image.size() , CV_8U , cv::Scalar(255)) ;  
    cv::drawContours(result , contours ,  
        -1 , cv::Scalar(0) , 2) ;  
    cv::imshow("resultImage" , result) ;  
      
    //获取所有轮廓包括轮廓内的轮廓  
    std::vector<std::vector<cv::Point>> allContours ;  
    cv::Mat allContoursResult(image.size() , CV_8U , cv::Scalar(255)) ;  
    cv::findContours(image , allContours ,  
        CV_RETR_LIST , CV_CHAIN_APPROX_NONE) ;  
    cv::drawContours(allContoursResult , allContours ,-1 ,  
        cv::Scalar(0) , 2) ;  
    cv::imshow("allContours" , allContoursResult) ;  
  
    //获取轮廓的等级  
    std::vector<cv::Vec4i> hierarchy ;  
    cv::findContours(image , contours , hierarchy , CV_RETR_TREE ,  
        CV_CHAIN_APPROX_NONE) ;  
  
    cv::waitKey(0) ;  
    return 0 ;  

 

1、获取包围对象的垂直矩阵

 

[cpp] view plain copy

  1. cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));  
  2. cv::rectangle(result,r0,cv::Scalar(0),2);  


2、获取包围对象的最小圆

 

 

[cpp] view plain copy

  1. cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));  
  2. cv::rectangle(result,r0,cv::Scalar(0),2);  


3、获取包围对象的多边形

 

 

[cpp] view plain copy

  1. // testing the approximate polygon  
  2. std::vector<cv::Point> poly;  
  3. cv::approxPolyDP(cv::Mat(contours[2]),poly,  
  4. 5, // accuracy of the approximation  
  5. true); // yes it is a closed shape  


4、获得包围对象的凸包

 

 

[cpp] view plain copy

  1. // testing the convex hull  
  2. std::vector<cv::Point> hull;  
  3. cv::convexHull(cv::Mat(contours[3]),hull);  


5、获取各个对象的质心

 

 

[cpp] view plain copy

  1. itc= contours.begin();  
  2. while (itc!=contours.end())   
  3. // compute all moments  
  4. cv::Moments mom= cv::moments(cv::Mat(*itc++));  
  5. // draw mass center  
  6. cv::circle(result,  
  7. // position of mass center converted to integer  
  8. cv::Point(mom.m10/mom.m00,mom.m01/mom.m00),  
  9. 2,cv::Scalar(0),2); // draw black dot  
  10.  

最小外接矩形

//绘制轮廓的最小外结矩形  
        RotatedRect rect=minAreaRect(contours[i]);  
        Point2f P[4];  
        rect.points(P);  
        for(int j=0;j<=3;j++)  
          
            line(imageContours,P[j],P[(j+1)%4],Scalar(255),2);  
          

 

 

 

图片合并

 

//按行合并如下:
cv::Mat mergeRows(cv::Mat A, cv::Mat B)

    // cv::CV_ASSERT(A.cols == B.cols&&A.type() == B.type());
    int totalRows = A.rows + B.rows;
    cv::Mat mergedDescriptors(totalRows, A.cols, A.type());
    cv::Mat submat = mergedDescriptors.rowRange(0, A.rows);
    A.copyTo(submat);
    submat = mergedDescriptors.rowRange(A.rows, totalRows);
    B.copyTo(submat);
    return mergedDescriptors;

//按列合并如下:
cv::Mat mergeCols(cv::Mat A, cv::Mat B)

    // cv::CV_ASSERT(A.cols == B.cols&&A.type() == B.type());
    int totalCols = A.cols + B.cols;
    cv::Mat mergedDescriptors(A.rows,totalCols, A.type());
    cv::Mat submat = mergedDescriptors.colRange(0, A.cols);
    A.copyTo(submat);
    submat = mergedDescriptors.colRange(A.cols, totalCols);
    B.copyTo(submat);
    return mergedDescriptors;

文件夹中所有文件遍历,区分是目录还是文件

void dir(string path_src, string path_dst)

	long hFile = 0;
	struct _finddata_t fileInfo;
	string pathName, exdName;
	// \\\\* 代表要遍历所有的类型
	if ((hFile = _findfirst(pathName.assign(path_src).append("\\\\*").c_str(), &fileInfo)) == -1) 
		return;
	
	do 
	
		//判断文件的属性是文件夹还是文件
		cout << fileInfo.name << (fileInfo.attrib&_A_SUBDIR? "[folder]":"[file]") << endl;
		string sfilename = fileInfo.name;
		string sfiletype = (fileInfo.attrib&_A_SUBDIR? "[folder]":"[file]");

		if((sfiletype == "[folder]") && (sfilename != "." && sfilename != ".."))
		
			//对文件夹的操作
			string tmp = path_dst + "\\\\" + sfilename;
			char* str = (char*)tmp.c_str();
			_mkdir(str);

			string dirpath_src = src_path + "\\\\" + sfilename;
			string dirpath_dst = dst_path + "\\\\" + sfilename;
			dir(dirpath_src, dirpath_dst);
		
		if(sfiletype == "[file]")
		
			//对文件的操作
		

	 while (_findnext(hFile, &fileInfo) == 0);
	_findclose(hFile);
	return;

 

 

 

 

 

 

 

以上是关于mfc常用的代码更新的主要内容,如果未能解决你的问题,请参考以下文章

卡尔曼滤波实例——预测橘子的轨迹

K 均值聚类:更新每个聚类的质心并选择颜色的功能

MFC常用的简单代码

聚类算法:K均值

C ++ MFC:将常用控件分成一组

机器学习K-Means