如何在MFCview视图下显示opencv Mat矩阵图像
2016-03-01 20:22
429 查看
在这里我主要介绍两种关于如何在MFCview视图下显示opencv Mat矩阵图像方法
方法一:基于MFC和ATL共享的新类CImage的方法。
方法二:基于GDI+绘图的方法。、
在这里我主要介绍第二种方法
1.添加文档变量
在Doc文档下添加public访问类型为cv::Mat变量(opencv环境自己搭配)并重写OnOpenDocument虚函数。如下所示
2.初始化类库
在CWinApp的继承类中定义:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
在InitInstance 中调用:
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
在ExitInstance中调用:
GdiplusShutdown(gdiplusToken);
3.在view视图下显示图像
首先判断通道个数,将读取的Mat矩阵转化为BGRA4通道类型,然后生成Gdiplus::Bitmap类型,最后调用Gdiplus绘
图指令,将图像显示出来。
方法一:基于MFC和ATL共享的新类CImage的方法。
方法二:基于GDI+绘图的方法。、
在这里我主要介绍第二种方法
1.添加文档变量
在Doc文档下添加public访问类型为cv::Mat变量(opencv环境自己搭配)并重写OnOpenDocument虚函数。如下所示
BOOL CgdiplusDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; std::string path = CT2A(lpszPathName); img = cv::imread(path, -1); if (!img.data) { MessageBox(NULL, lpszPathName, _T("无法打开图像格式"), MB_OK); } return TRUE; }
2.初始化类库
在CWinApp的继承类中定义:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
在InitInstance 中调用:
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
在ExitInstance中调用:
GdiplusShutdown(gdiplusToken);
3.在view视图下显示图像
首先判断通道个数,将读取的Mat矩阵转化为BGRA4通道类型,然后生成Gdiplus::Bitmap类型,最后调用Gdiplus绘
图指令,将图像显示出来。
void CImageShowGDIView::OnDraw(CDC* pDC) { CImageShowGDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 cv::Mat newImage; if (pDoc->img.channels() == 1) { cv::cvtColor(pDoc->img, newImage, CV_GRAY2BGRA); } else if (pDoc->img.channels() == 3) { cv::cvtColor(pDoc->img, newImage, CV_BGR2BGRA); } else { newImage = pDoc->img; } Gdiplus::Bitmap bitmap(newImage.cols, newImage.rows, newImage.step1(), PixelFormat32bppARGB, newImage.data); //Gdiplus::Bitmap bitmap(pDoc->img.cols, pDoc->img.rows, pDoc->img.step, //每一行的字节数 // PixelFormat24bppRGB, pDoc->img.data); Gdiplus::Graphics graphics(pDC->GetSafeHdc()); graphics.DrawImage(&bitmap, 0, 0); }
相关文章推荐
- Linux常用命令
- 点击返回键退出popupwindow的方法
- Linux学习笔记:shell的初次使用
- 搜索命令:which,locate
- 了解apache Hadoop--Hadoop最全生态系统介绍
- opencv初探(一)
- Linux内核分析——第二周学习笔记20135308
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 导TVServer中学到命令
- Linux学习笔记:对linux的简单理解
- 在CentOS6.5上安装Tomcat6
- Operating Systems: Three Easy Pieces阅读笔记(四)FILE SYSTEM- VSFC&FSCK
- Linux文件系统基础(2)
- powershell 生成随机用户信息
- Apache shiro 笔记整理之web整合一
- 浅谈web网站架构演变过程(转)
- Linux 中的零拷贝技术
- .NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)
- 谈谈对于企业级系统架构的理解
- linux-framebuffer设备——读取触摸屏信息