使用GDI+可以方便的把OpenCV的圖像矩陣類型數據顯示在MFC的窗口中
void BitMatToWnd(CWnd* wnd, cv::Mat img, CRect *Roi)
{
if(img.empty())
return;
CDC *cdc = wnd->GetDC();
CDC MemDC;//首先定義一個顯示設備對象
CBitmap MemBitmap;//定義一個位圖對象
CRect rect, drect;
wnd->GetClientRect(rect);
Gdiplus::Bitmap bitmap(img.cols, img.rows, img.cols * img.channels(), PixelFormat24bppRGB, (BYTE*)img.data);//根據Mat矩陣創建一個GDI+中的Bitmap位圖
if(Roi == NULL)
drect = rect;
else
drect = *Roi;
//隨后建立與屏幕顯示兼容的內存顯示設備
MemDC.CreateCompatibleDC(cdc);
//下面建立一個與屏幕顯示兼容的位圖,至於位圖的大小,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(cdc, rect.Width(), rect.Height());
//將位圖選入到內存顯示設備中
//只有選入了位圖的內存顯示設備才有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將位圖清除干凈,可以用自己應該用的顏色
MemDC.FillSolidRect(0,0, rect.Width(), rect.Height(),RGB(255,255,255));
//繪圖
Gdiplus::Graphics g(MemDC.m_hDC);
Gdiplus::Image *ii = &bitmap;
g.DrawImage(ii, Gdiplus::Rect(0,0,drect.Width(),drect.Height()));
g.ReleaseHDC(MemDC.m_hDC);
//將內存中的圖拷貝到屏幕上進行顯示
cdc->BitBlt(0,0,drect.Width(),drect.Height(),&MemDC,0, 0,SRCCOPY);
//繪圖完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(cdc);
}