您的位置:首页 > 运维架构

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

2017-01-16 14:47 411 查看

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

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

[cpp] view
plain copy

 print?

#include "CvvImage.h"  

#include <opencv2/core/core.hpp>  

#include <opencv2/highgui/highgui.hpp>  

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

[cpp] view
plain copy

 print?

int ShowMat(cv::Mat img, HWND hWndDisplay);//显示Mat  

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

[cpp] view
plain copy

 print?

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;   

}  

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

[cpp] view
plain copy

 print?

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类型的图片了。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: