MFC和openCV連用顯示圖片
阿新 • • 發佈:2018-12-22
這幾天開始學習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即可開啟任意圖片。
五、執行結果: