想把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數據是否是有效的,如下圖中所示
定義位圖數據結構,用以方便在圖形設備接口(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
);
}