【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的倍數來解決這個問題。