在MFC的picture控件中如何顯示Mat圖?

Tags: 函數, 控件中,

想把kinect V1.0設備獲取到的彩色圖顯示在MFC的picture控件中,圖的格式是opencv中的Mat矩陣,每秒30幀,顯示相對還是比較流暢。整個接口由一個函數完成,函數無返回值,要求輸入picture控件ID和Mat圖像矩陣

函數:void showMatImgToWnd(CWnd* pWnd, const cv::Mat& img)

工具/原料

win7(64位)+vs2012+opencv2.44+kinect v1.0

kinect的SDK和開發工具

方法/步驟

首先,要進行輸入檢查,看Mat數據是否是有效的,如下圖中所示

在MFC的picture控件中如何顯示Mat圖

定義位圖數據結構,用以方便在圖形設備接口(GraphicsDeviceInterface)上顯示,也就是windows上的GDI

在MFC的picture控件中如何顯示Mat圖

開發內存空間,並初始化,按下圖中所示那樣即可

在MFC的picture控件中如何顯示Mat圖

定義位圖相關信息,並和輸入數據Mat圖聯繫起來

在MFC的picture控件中如何顯示Mat圖

在MFC的picture控件中如何顯示Mat圖

在獲取控件的客戶區,並設置圖像的顯示模式,SetStretchBltMode是Windows GDI函數,功能為該函數可以設置指定設備環境中的位圖拉伸模式。COLORONCOLOR:刪除像素。該模式刪除所有消除的像素行,不保留其信息。

在MFC的picture控件中如何顯示Mat圖

完成上述後,將內存中的圖像數據拷貝到屏幕上,執行如下圖中所示

在MFC的picture控件中如何顯示Mat圖

上面寫了顯示的關鍵步驟,下面貼上詳細源碼,以方便大家理解:

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

);

}

相關問題答案