作者:和尚与尼姑离婚 | 来源:互联网 | 2023-09-23 18:22
之前都是用qt做界面,MFC方式未使用过。公司现场需求,学习下MFC
闲言碎语
- 4、思来想去,把效果放在文首吧
- 1、创建MFC项目
- 2、搭建界面
- 3、配置代码
4、思来想去,把效果放在文首吧
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/66d1daef0010860f.gif)
1、创建MFC项目
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/fe26b424628e1c1b.png)
选择MFC应用,下一步,填写项目相关信息,名称和路径。我这里CSDNShowCamera,之后点击创建
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/02c57c51b954fd2e.png)
开始配置MFC应用程序具体参数
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/2638102c0d4dae4f.png)
1、选择 基于对话框 应用程序类型;
2、下一步,再下一步,取消 粗框架和系统菜单 勾选
3、完成后,直接完成
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/cb1755082cbb05ef.png)
进入编辑界面
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/c0ada41214318137.png)
2、搭建界面
这里制作一个简单的图像读取显示界面
-
删除界面TODO、删除取消按钮、将确定按钮中文字确定修改成close
修改的模块的参数,点击该工具,右键属性,会跳出该工具属性框,如下
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/d58ec5cd8ce5ce47.png)
修改描述文字:确定 -> close
- 添加图片显示控件(Picture Control,可以在界面右侧工具箱中搜索),鼠标点击拖曳到主界面上,如下
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/95e5cd64b0570035.png)
属性 杂项:
1、修改ID: IDC_STATIC -> IDC_IMG_COGNEX
2、调整框子大小
- 添加一个控件 Button,用于显示图片
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/9166a32cb59ab1e3.png)
修改描述文字: -> ReadImg
以上项目界面配置完成,接下来进行控件相应代码配置
3、配置代码
-
配置opencv属性
VC++目录 -> 包含目录 :opencvG:\VisualStudioCode\configuration_libs\opencv411\includeG:\VisualStudioCode\configuration_libs\opencv411\include\opencv2:MVS G:\VisualStudioCode\configuration_libs\MVS\Development\Includes:torchG:\VisualStudioCode\configuration_libs\libtorch-win-shared-with-deps-1.8.0+cu111\libtorch\includeVC++目录 -> 库目录 :opencv G:\VisualStudioCode\configuration_libs\opencv411\x64\vc15\lib:torchG:\VisualStudioCode\configuration_libs\libtorch-win-shared-with-deps-1.8.0+cu111\libtorch\lib:MVSG:\VisualStudioCode\configuration_libs\MVS\Development\Libraries\win64G:\VisualStudioCode\configuration_libs\MindVision\SDK\X64
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/39ac00fb346f7db6.png)
链接器->输入->附加依赖项:
MVCAMSDK_X64.lib
MvCameraControl.lib
torch.lib
torch_cpu.lib
c10.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
opencv_world411.lib
asmjit.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
mkldnn.lib
配置好后,开始写控件代码;针对每一个控件,如若有相应代码响应的话,双击该控件即可进入代码编辑界面;
- 2.1 CSDNShowCameraDlg.cpp
/*获取指定文件夹下的文件*/
void CCSDNShowCameraDlg::getFiles(std::string path, std::vector& files)
{intptr_t hFile = 0;struct _finddata_t fileinfo;std::string p;if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1){do{if ((fileinfo.attrib & _A_SUBDIR)){if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)getFiles(p.assign(path).append("\\").append(fileinfo.name), files);}else{files.push_back(p.assign(path).append("\\").append(fileinfo.name));}} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);}
}
char string_print_file_dir[1024] = "";//获取指定文件夹内的所有图片sprintf_s(string_print_file_dir, "%s", "E:\\Download\\hawen\\");char* filePath = string_print_file_dir;std::vector files;std::vector gradient_list;getFiles(filePath, files);//自定义的一个函数,如下char string_print_10[1024] = "";int cnttest = 1;sprintf_s(string_print_10, "\n%10s: %s\n", "当前识别图片", files[cnttest].c_str());for (size_t num=0; num void CCSDNShowCameraDlg::ReadImg(std::string img_path)
{//define all variablescv::Mat Rect_img;cvimage &#61; cv::imread(img_path, 0);std::cout <<", 读取完成......" ;CRect rect;GetDlgItem(IDC_IMG_COGNEX)->GetWindowRect(&rect); // 获取控件大小//show the imageresize(cvimage, Rect_img, cv::Size(rect.Width(), rect.Height()));switch (Rect_img.channels()){case 1:cv::cvtColor(Rect_img, Rect_img, cv::COLOR_GRAY2BGRA); // GRAY单通道 break;case 3:cv::cvtColor(Rect_img, Rect_img, cv::COLOR_BGR2BGRA); // BGR三通道 break;default: break;}int pixelBytes &#61; Rect_img.channels() * (Rect_img.depth() &#43; 1); // 计算一个像素多少个字节BITMAPINFO bitInfo;bitInfo.bmiHeader.biBitCount &#61; 8 * pixelBytes;bitInfo.bmiHeader.biWidth &#61; Rect_img.cols;bitInfo.bmiHeader.biHeight &#61; -Rect_img.rows;bitInfo.bmiHeader.biPlanes &#61; 1;bitInfo.bmiHeader.biSize &#61; sizeof(BITMAPINFOHEADER);bitInfo.bmiHeader.biCompression &#61; BI_RGB;bitInfo.bmiHeader.biClrImportant &#61; 0;bitInfo.bmiHeader.biClrUsed &#61; 0;bitInfo.bmiHeader.biSizeImage &#61; 0;bitInfo.bmiHeader.biXPelsPerMeter &#61; 0;bitInfo.bmiHeader.biYPelsPerMeter &#61; 0;//CDC* pDC &#61; GetDlgItem(IDC_IMG_COGNEX)->GetDC();::StretchDIBits(sfdc,0, 0, rect.Width(), rect.Height(),0, 0, rect.Width(), rect.Height(),Rect_img.data,&bitInfo,DIB_RGB_COLORS,SRCCOPY);//ReleaseDC(pDC);///draw image to client
}
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/ce3c4355ad1a7780.png)
-
2.2 CSDNShowCameraDlg.h
// CSDNShowCameraDlg.h: 头文件
//#pragma once
#include
#include
#include "opencv2/opencv.hpp"#include
#include
#include
using namespace cv;// CCSDNShowCameraDlg 对话框
class CCSDNShowCameraDlg : public CDialogEx
{
// 构造
public:CCSDNShowCameraDlg(CWnd* pParent &#61; nullptr); // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD &#61; IDD_CSDNSHOWCAMERA_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持HDC sfdc;cv::Mat cvimage;void getFiles(std::string path, std::vector& files);//获取文件夹下所有图片void ReadImg(std::string img_path);//读取图片&#xff0c;显示// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton1();
};
![在这里插入图片描述](https://img0.php1.cn/3cdc5/6de3/5a0/ae2dbe444a6148f2.png)