天天看點

【MFC】-004 GDI+顯示OpenCV加載的Mat矩陣【MFC】-004 GDI+顯示OpenCV加載的Mat矩陣

【MFC】-004 GDI+顯示OpenCV加載的Mat矩陣

  • 【MFC】-004 GDI+顯示OpenCV加載的Mat矩陣
    • 1、由來
    • 2、步驟
      • 2.1 GDI+啟用
      • 2.2 OpenCV讀取圖像
      • 2.3 GDI+顯示圖像
    • 3、坑s
      • 3.1 OpenCV3.4.2 字元集問題
      • 3.2 GDI+ Bitmap指針構造
      • 3.3 Bitmap要求圖像寬度4對齊

1、由來

  OpenCV3.0取消了以前版本中用于在MFC中顯示圖像所使用的

Cvvimage

類。雖然能夠去以前版本的OpenCV中将

Cvvimage

類源代碼導出到來使用,但沒有試過與3.4.2是否相容。是以嘗試将Mat轉換到GDI+的Bitmap進行顯示。

2、步驟

2.1 GDI+啟用

  按照正常套路啟用GDI+即可。可以參考(https://blog.csdn.net/freehawkzk/article/details/80829983)進行GDI+的使用。

2.2 OpenCV讀取圖像

  使用OpenCV讀取圖像并儲存成Mat。

m_srcImg = cv::imread(s);//讀取圖像
           

  這裡有一個坑,OpenCV3.4.2預設使用MBCS字元集,而在VS2013中預設使用Unicode字元集,并且VS2013預設未安裝MBCS字元集的MFC支援。當使用Unicode字元集編譯OpenCV3.4.2時Release版會發生編譯錯誤,debug版編譯倒是沒問題。MFC MBCS字元集程式的支援需要安裝vc_mbcsmfc.exe程式,在MS官方下載下傳網站上有。

2.3 GDI+顯示圖像

  使用GDI+顯示圖像,主要使用

Gdiplus::Graphics::DrawImage

接口。該接口接收一個

Gdiplus::Bitmap

對象和一些繪制區域的參數,可以完成圖像的顯示。

  以上是構造Bitmap對象并将Mat矩陣的資料傳遞給該對象的方法。

  構造好Bitmap對象之後,可以使用Graphics進行顯示。

Gdiplus::Rect srcRt;
        srcRt.X = ;
        srcRt.Y = ;
        srcRt.Width = m_pDstBitmap->GetWidth()*m_fScaleDstImg;
        srcRt.Height = m_pDstBitmap->GetHeight()*m_fScaleDstImg;
        m_pDstGraphics->DrawImage(m_pDstBitmap, srcRt);
           

  這裡使用Bitmap對象+繪制區域矩形的方式進行繪制。

3、坑s

3.1 OpenCV3.4.2 字元集問題

  這裡有一個坑,OpenCV3.4.2預設使用MBCS字元集,而在VS2013中預設使用Unicode字元集,并且VS2013預設未安裝MBCS字元集的MFC支援。當使用Unicode字元集編譯OpenCV3.4.2時Release版會發生編譯錯誤,debug版編譯倒是沒問題。MFC MBCS字元集程式的支援需要安裝vc_mbcsmfc.exe程式,在MS官方下載下傳網站上有。

3.2 GDI+ Bitmap指針構造

  在預設MFC程式中,定義了以下宏:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
           

  該宏會導緻使用new操作符生成Bitmap指針時發生編譯錯誤。我使用的是将該宏注釋掉的方式解決這個問題。

3.3 Bitmap要求圖像寬度4對齊

  當圖像寬度不能被4整除時,建立Bitmap對象将無法成功。

通過将圖像大小重置成4的倍數來解決這個問題。