opencv筆記(三十四)——在MFC的picture控制元件中如何顯示Mat圖
阿新 • • 發佈:2018-12-26
想把kinect V1.0裝置獲取到的彩色圖顯示在MFC的picture控制元件中,圖的格式是opencv中的Mat矩陣,每秒30幀,顯示相對還是比較流暢。整個介面由一個函式完成,函式無返回值,要求輸入picture控制元件ID和Mat影象矩陣
函式:void showMatImgToWnd(CWnd* pWnd, const cv::Mat& img) |
1、首先,要進行輸入檢查,看Mat資料是否是有效的,如下圖中所示
if (img.empty()) return;
2、定義點陣圖資料結構,用以方便在圖形裝置介面(GraphicsDeviceInterface)上顯示,也就是windows上的GDI
static BITMAPINFO *bitMapinfo = NULL;
static bool First = TRUE;
if (First)
{
BYTE *bitBuffer = new BYTE[40 + 4 * 256];//開闢一個記憶體區域
3、開發記憶體空間,並初始化,按下圖中所示那樣即可
memset(bitBuffer, 0, 40 + 4 * 256); /* void *memset(void *s, int c, size_t n) 將已開闢記憶體空間s的首n個位元組的值設為值c */
4、定義點陣圖相關資訊,並和輸入資料Mat圖聯絡起來
5、在獲取控制元件的客戶區,並設定影象的顯示模式,SetStretchBltMode是Windows GDI函式,功能為該函式可以設定指定裝置環境中的點陣圖拉伸模式。COLORONCOLOR:刪除畫素。該模式刪除所有消除的畫素行,不保留其資訊。
CRect drect; pWnd->GetClientRect(drect); //pWnd指向CWnd類的一個指標 CClientDC dc(pWnd); HDC hDC = dc.GetSafeHdc(); //HDC是Windows的一種資料型別,是裝置描述控制代碼; SetStretchBltMode(hDC, COLORONCOLOR);
6、完成上述後,將記憶體中的影象資料拷貝到螢幕上,執行如下圖中所示
StretchDIBits(hDC,
0,
0,
drect.right, //顯示視窗寬度
drect.bottom, //顯示視窗高度
0,
0,
img.cols, //影象寬度
img.rows, //影象高度
img.data,
bitMapinfo,
DIB_RGB_COLORS,
SRCCOPY
);
具體程式碼:
void CCam_MFC_6Dlg::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
);
}
轉自:https://jingyan.baidu.com/article/20b68a88b1dd7e796dec6241.html