【OPENCV MFC】VS2012+MFC+Opencv2.4.9显示Mat类型图片

4 篇文章 0 订阅


第一件事加两个文件CvvImage.h,CvvImage.cpp,因为opencv2.2之后这两个被抛弃了。。。所以咱得手动加回来,如果没有这两个文件,可以在网上下载到。(分别加载到头文件和源文件处)


然后在项目头文件下,本文是Opencv_mfcDlg.h中添加头文件:

[cpp]   view plain  copy
 print ?
  1. #include "CvvImage.h"  
  2. #include <opencv2/core/core.hpp>  
  3. #include <opencv2/highgui/highgui.hpp>  


然后同样在这个头文件下 COpencv_mfcDlg 对话框类下即:class COpencv_mfcDlg : public CDialogEx{}下添加显示mat的函数声明:





[cpp]   view plain  copy
 print ?
  1. int ShowMat(cv::Mat img, HWND hWndDisplay);//显示Mat  


然后在Opencv_mfcDlg.cpp下实现这个函数:

[cpp]   view plain  copy
 print ?
  1. int COpencv_mfcDlg::ShowMat(cv::Mat img, HWND hWndDisplay)   
  2. {   
  3.     if (img.channels()<3 ) { return -1; }   
  4.     //构造将要显示的Mat版本图片   
  5.     RECT rect;   
  6.     ::GetClientRect(hWndDisplay, &rect);   
  7.     cv::Mat imgShow( abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3 );   
  8.     resize( img, imgShow, imgShow.size() );   
  9.     //在控件上显示要用到的CImage类图片   
  10.     ATL::CImage CI;   
  11.     int w=imgShow.cols;//宽   
  12.     int h=imgShow.rows;//高   
  13.     int channels=imgShow.channels();//通道数   
  14.     CI.Create( w, h, 8*channels); //CI像素的复制   
  15.     uchar *pS; uchar *pImg=(uchar *)CI.GetBits();//得到CImage数据区地址   
  16.     int step=CI.GetPitch();   
  17.     for(int i=0;i<h;i++)   
  18.     {   
  19.         pS=imgShow.ptr<uchar>(i);  
  20.         for(int j=0;j<w;j++)   
  21.         {   
  22.             for(int k=0;k<3;k++)   
  23.                 *(pImg+i*step+j*3+k)=pS[j*3+k]; //注意到这里的step不用乘以3   
  24.         }   
  25.     }   
  26.     //在控件显示图片   
  27.     HDC dc ;   
  28.     dc = ::GetDC(hWndDisplay);   
  29.     CI.Draw( dc, 0, 0 );   
  30.     ::ReleaseDC( hWndDisplay, dc);   
  31.     CI.Destroy();   
  32.     return 0;   
  33. }  


然后搞个控件函数打开图像文件并调用上面的函数显示图像:

[cpp]   view plain  copy
 print ?
  1. void COpencv_mfcDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: 在此添加控件通知处理程序代码  
  4.     CString FilePath;   
  5.     CFileDialog FileDlg(TRUE);   
  6.     if (IDOK == FileDlg.DoModal())   
  7.     {   
  8.         //获取FileOpen对话框返回的路径名  
  9.         FilePath = FileDlg.GetPathName();   
  10.         //GetPathName返回的是CString类型,要经过转换为string类型才能使用imread打开图片   
  11.         std::string pathName(FilePath.GetBuffer());   
  12.         //读取图片   
  13.         cv::Mat orgImg = cv::imread(pathName);   
  14.         //显示图片   
  15.         ShowMat(orgImg, GetDlgItem(IDC_STATIC)->GetSafeHwnd());  
  16.     }  
  17. }  


完成上述工作之后,就可以在MFC中显示Mat类型的图片了。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值