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("
窗口名
",
要显示的图片
);//
在创建的窗口中显示图片
#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
- cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
- cv::rectangle(result,r0,cv::Scalar(0),2);
2、获取包围对象的最小圆
[cpp] view plain copy
- cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
- cv::rectangle(result,r0,cv::Scalar(0),2);
3、获取包围对象的多边形
[cpp] view plain copy
- // testing the approximate polygon
- std::vector<cv::Point> poly;
- cv::approxPolyDP(cv::Mat(contours[2]),poly,
- 5, // accuracy of the approximation
- true); // yes it is a closed shape
4、获得包围对象的凸包
[cpp] view plain copy
- // testing the convex hull
- std::vector<cv::Point> hull;
- cv::convexHull(cv::Mat(contours[3]),hull);
5、获取各个对象的质心
[cpp] view plain copy
- itc= contours.begin();
- while (itc!=contours.end())
- // compute all moments
- cv::Moments mom= cv::moments(cv::Mat(*itc++));
- // draw mass center
- cv::circle(result,
- // position of mass center converted to integer
- cv::Point(mom.m10/mom.m00,mom.m01/mom.m00),
- 2,cv::Scalar(0),2); // draw black dot
最小外接矩形
//绘制轮廓的最小外结矩形
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常用的代码更新的主要内容,如果未能解决你的问题,请参考以下文章