第一件事加两个文件CvvImage.h,CvvImage.cpp,因为opencv2.2之后这两个被抛弃了。。。所以咱得手动加回来,如果没有这两个文件,可以在网上下载到。(分别加载到头文件和源文件处)
然后在项目头文件下,本文是Opencv_mfcDlg.h中添加头文件:
- #include "CvvImage.h"
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
然后同样在这个头文件下 COpencv_mfcDlg 对话框类下即:class COpencv_mfcDlg : public CDialogEx{}下添加显示mat的函数声明:
- int ShowMat(cv::Mat img, HWND hWndDisplay);//显示Mat
然后在Opencv_mfcDlg.cpp下实现这个函数:
- int COpencv_mfcDlg::ShowMat(cv::Mat img, HWND hWndDisplay)
- {
- if (img.channels()<3 ) { return -1; }
- //构造将要显示的Mat版本图片
- RECT rect;
- ::GetClientRect(hWndDisplay, &rect);
- cv::Mat imgShow( abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3 );
- resize( img, imgShow, imgShow.size() );
- //在控件上显示要用到的CImage类图片
- ATL::CImage CI;
- int w=imgShow.cols;//宽
- int h=imgShow.rows;//高
- int channels=imgShow.channels();//通道数
- CI.Create( w, h, 8*channels); //CI像素的复制
- uchar *pS; uchar *pImg=(uchar *)CI.GetBits();//得到CImage数据区地址
- int step=CI.GetPitch();
- for(int i=0;i<h;i++)
- {
- pS=imgShow.ptr<uchar>(i);
- for(int j=0;j<w;j++)
- {
- for(int k=0;k<3;k++)
- *(pImg+i*step+j*3+k)=pS[j*3+k]; //注意到这里的step不用乘以3
- }
- }
- //在控件显示图片
- HDC dc ;
- dc = ::GetDC(hWndDisplay);
- CI.Draw( dc, 0, 0 );
- ::ReleaseDC( hWndDisplay, dc);
- CI.Destroy();
- return 0;
- }
然后搞个控件函数打开图像文件并调用上面的函数显示图像:
- void COpencv_mfcDlg::OnBnClickedButton1()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString FilePath;
- CFileDialog FileDlg(TRUE);
- if (IDOK == FileDlg.DoModal())
- {
- //获取FileOpen对话框返回的路径名
- FilePath = FileDlg.GetPathName();
- //GetPathName返回的是CString类型,要经过转换为string类型才能使用imread打开图片
- std::string pathName(FilePath.GetBuffer());
- //读取图片
- cv::Mat orgImg = cv::imread(pathName);
- //显示图片
- ShowMat(orgImg, GetDlgItem(IDC_STATIC)->GetSafeHwnd());
- }
- }
完成上述工作之后,就可以在MFC中显示Mat类型的图片了。