博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在MFC中显示OpenCV的Mat图像矩阵

Posted on 2012-06-21 16:43  yuanzfy  阅读(4269)  评论(0编辑  收藏  举报

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