在MFC中顯示OpenCV的Mat圖像矩陣


使用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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM