【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类型的图片了。
第一件事加两个文件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类型的图片了。
相关文章推荐
- 将Opencv2的Mat类型数据显示到MFC窗口上
- MFC显示Mat数据格式(Opencv)图片,保证4字节对齐,图片缩放不错行
- 知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
- MFC显示Mat数据格式(Opencv)图片,保证4字节对齐,图片缩放不错行
- 在 MFC 框架中,有什么方法能直接将 OpenCV 2.0 库中 Mat 格式的图片传递到 Picture Control(图片控件)显示?
- 在MFC图像控件上显示opencv Mat格式图片
- [opencv][MFC]显示mat图片于mfc
- OpenCV读取图片在MFC中显示的问题
- 在MFC中如何显示OpenCV的图像Mat
- opencv2.2 MFC picture控件中显示图片
- Qt中使用OpenCV显示图片时,Mat结构转换为QImage结构的问题
- C#-opencv-------显示图片异常"Emgu.CV.CvInvoke"的类型初始值设
- 利用OPenCV在MFC对话框上显示图片
- OpenCV 用cv::Mat显示OpenNI获得的Kinect深度图片
- VS2010配置opencv2.4.8,用MFC创建显示一个图片的简单程序
- OpenCV 2.2版本以上显示图片到 MFC 的 Picture Control 控件中
- 如何让OpenCV的图片显示在MFC窗口上
- Opencv (Opencv2)结合MFC学习数字图像处理【3】---显示图片
- opencv学习笔记(二)vs2010+opencv2.3.1 mfc的实现---利用图片控件显示
- opencv中Mat类型的图片或矩阵的简单合并