1. 程式人生 > >MFC和openCV連用顯示圖片

MFC和openCV連用顯示圖片

這幾天開始學習openCV,不過openCV做圖形介面太簡陋,於是決定用MFC和openCV做,在MFC中呼叫openCV顯示圖片。

執行環境:VS2015+openCV3.4.3,配置的話可以去看看淺墨大神的部落格和書籍。

一、先開啟VS2015,建立一個MFC工程,名字為cvMFC,選擇對話方塊型別,其餘按預設操作來就行。

然後開啟資源檢視的對話方塊欄,在對話方塊中新增控制元件。把原來的預設的兩個按鈕都刪了,新增一個picture Control,ID為IDC_PIC,再新增一個按鈕控制元件,ID為IDC_BTN_OPEN,caption為“開啟圖片”。完成以上步驟得下圖:

二、切換到解決方案資源管理器,在cvMFCDlg.h中新增以下標頭檔案和宣告檔案:

#include<opencv2\opencv.hpp>
using namespace cv;

以上為openCV的標頭檔案,接著新增一個成員變數,主要是為了獲取圖片控制元件的尺寸:

CRect rect;

三、在cvMFCDlg.cpp原始檔中的OnInitDialog()函式中新增自定義程式碼如下:

//----------------------------【自定義程式碼處】--------------------------------------
	CWnd  *pWnd1 = GetDlgItem(IDC_PIC);//CWnd是MFC視窗類的基類,提供了微軟基礎類庫中所有視窗類的基本功能。
	pWnd1->GetClientRect(&rect);//GetClientRect為獲得控制元件相自身的座標大小
	namedWindow("src1", WINDOW_AUTOSIZE);//設定視窗名
	HWND hWndl = (HWND)cvGetWindowHandle("src1");//hWnd 表示視窗控制代碼,獲取視窗控制代碼
	HWND hParent1 = ::GetParent(hWndl);//GetParent函式一個指定子視窗的父視窗控制代碼
	::SetParent(hWndl, GetDlgItem(IDC_PIC)->m_hWnd);
	::ShowWindow(hParent1, SW_HIDE);
	Mat srcImg = imread("bk.jpg");
	resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
	imshow("src1", srcImg);
//----------------------------【自定義程式碼處】--------------------------------------

簡單的來說,就是首先得到圖片控制元件的大小,然後用namewindow函式建立一個視窗,然後得到其控制代碼,將其與圖片控價相關聯。後面又顯示了一幅圖片,如果不在初始化裡顯示這幅圖片,程式執行開始,圖片控制元件那裡有深灰色的陰影,所以加了一張淺色的照片。

四、為按鈕新增訊息響應函式。直接在對話方塊的資源檢視中右擊按鈕新增訊息響應函式,程式碼如下:

void CcvMFCDlg::OnBnClickedBtnOpen()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	TCHAR szFilter[] = _T("圖片檔案 (*.jpg)|*.jpg|All Files (*.*)|*.*||");
	// 構造開啟檔案對話方塊   
	CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
	CString strFilePath;

	// 顯示開啟檔案對話方塊   
	if (IDOK == fileDlg.DoModal())
	{
		// 如果點選了檔案對話方塊上的“開啟”按鈕,則將選擇的檔案路徑顯示到編輯框裡   
		strFilePath = fileDlg.GetPathName();
		USES_CONVERSION;
		char *s = T2A(strFilePath);
		Mat srcImg = imread(s);
		resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
		imshow("src1", srcImg);
	}
}

利用MFC的檔案對話方塊獲取圖片的地址,然後將CString轉換成char *型別,傳給imread即可開啟任意圖片。

五、執行結果: