在MFC的picture控件中如何显示Mat图
首先,要進行輸入檢查,看Mat數據是否是有效的,如下圖中所示
定義位圖數據結構,用以方便在圖形設備接口(GraphicsDeviceInterface)上顯示,也就是windows上的GDI
開發內存空間,并初始化,按下圖中所示那樣即可
定義位圖相關信息,并和輸入數據Mat圖聯系起來
在獲取控件的客戶區,并設置圖像的顯示模式,SetStretchBltMode是Windows GDI函數,功能為該函數可以設置指定設備環境中的位圖拉伸模式。COLORONCOLOR:刪除像素。該模式刪除所有消除的像素行,不保留其信息。
完成上述后,將內存中的圖像數據拷貝到屏幕上,執行如下圖中所示
上面寫了顯示的關鍵步驟,下面貼上詳細源碼,以方便大家理解:
void showMatImgToWnd(CWnd* pWnd, const cv::Mat& img)
{?
??? if(img.empty())?
??????? return;?
?static BITMAPINFO *bitMapinfo = NULL;
?static bool First=TRUE;
?if(First)
?{??
??BYTE *bitBuffer?= new BYTE[40+4*256];//開辟一個內存區域
??if(bitBuffer == NULL)
??{?
???return;
??}
??First=FALSE;
??memset(bitBuffer, 0, 40+4*256);
??bitMapinfo = (BITMAPINFO *)bitBuffer;
??bitMapinfo->bmiHeader.biSize???= sizeof(BITMAPINFOHEADER);
??bitMapinfo->bmiHeader.biPlanes???= 1;???
??for(int i=0; i<256; i++)
??{?//顏色的取值范圍 (0-255)
???bitMapinfo->bmiColors[i].rgbBlue? =bitMapinfo->bmiColors[i].rgbGreen =bitMapinfo->bmiColors[i].rgbRed?? =(BYTE) i;
??}?
??}
??bitMapinfo->bmiHeader.biHeight?= -img.rows;???
???????bitMapinfo->bmiHeader.biWidth?= img.cols;
?bitMapinfo->bmiHeader.biBitCount= img.channels() *8;????
?
?CRect drect;???????
?pWnd->GetClientRect(drect);??? //pWnd指向CWnd類的一個指針?
?CClientDC dc(pWnd);
?HDC hDC =dc.GetSafeHdc();????????????????? //HDC是Windows的一種數據類型,是設備描述句柄;
?SetStretchBltMode(hDC, COLORONCOLOR);????
??????????????????????????????????????????StretchDIBits(hDC,
?????0,
?????0,
?????drect.right,??//顯示窗口寬度
?????drect.bottom,??//顯示窗口高度
?????0,
?????0,
?????img.cols,???? //圖像寬度
?????img.rows,???? //圖像高度
?????img.data,???
?????bitMapinfo,???
?????DIB_RGB_COLORS,?
?????SRCCOPY
????? );
}
?
?
總結
以上是生活随笔為你收集整理的在MFC的picture控件中如何显示Mat图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在OpenCV中将cv::Mat绘制到M
- 下一篇: 面试前您该做的事情