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

如何在MFCview视图下显示opencv Mat矩阵图像

2016-03-01 20:22 429 查看
在这里我主要介绍两种关于如何在MFCview视图下显示opencv Mat矩阵图像方法

方法一:基于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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: