在这里我主要介绍两种关于如何在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);
}