1. 程式人生 > >opencv筆記(三十四)——在MFC的picture控制元件中如何顯示Mat圖

opencv筆記(三十四)——在MFC的picture控制元件中如何顯示Mat圖

        想把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