用OpenCV將圖像顯示在MFC的窗口中

對於OpenCV2.3以上的版本來說沒有CvvImage類,所以要自己在工程中添加這個類,這個類的頭文件以及實現文件在網上都可以找到現成的。

添加好這個類之後,接下來就是怎麼去顯示這個圖像了,首先需要一張圖片,有兩種方式,一種是通過攝像機獲取,一種是直接在電腦文件中打開。

首先對於第一種從攝像機中獲取圖像,先要利用CvCapture* capture創建一個capture指針用來連接攝像機(這裏都是假設已經配置好OpenCV);然後就是獲取攝像機了:capture=cvCreateCameraCapture(0);得到攝像機之後,我們要從攝像機中抓拍圖像,那麼我們需要建立一個全局的IplImage*對象m_iImg,用來存儲圖像。然後將從攝像機中抓拍的圖像存儲到這個全局變量中,m_iImg=cvQueryFrame(capture);至此,我們已經從攝像機中得到我們想要的圖像了,那麼接下來就是怎麼把它在MFC的對話框中顯示的問題了。

在MFC中進行圖形圖像操作有一個基本的類CDC,這個類是從Windows中的DC類繼承來的,這個類基本上把所有的繪圖的功能全部包含進來了。因此我們首先需要創建一個CDC指針:CDC* pDC=GetDlgItem(ID)->GetDC();這樣我們就得到了某個控件資源相對應的CDC設備描述表了,有了這個還不夠,我們還需要獲得一個HDC,這個是窗口DC:HDC hDC;   hDC=pDC->GetSafeHdc();這樣利用這個hDC我們就可以進行繪圖操作了。然而要把IplImage格式的圖像顯示到MFC的窗口中,還需要CvvImage類的一個轉換。CvvImage cimg;      cimg.CopyOf(m_iImg);然後就可以用這個cimg把圖像繪製到MFC窗口中了,GetDlgItem(ID)->GetClientRect(&rect);這是獲取要繪製圖像的位置信息,有了位置信息就知道要把圖像繪製在哪個地方了:cimg.DrawToHDC(hDC,&rect);這樣我們就把圖像顯示到指定的窗口位置了。記得繪製完之後要釋放CDC:ReleaseDC(pDC);

第二種方式就是通過直接打開電腦中的圖像文件獲取圖像。那麼這種方式就設計到要在對話框中創建一個按鈕,然後對這個按鈕控件添加消息效用函數,在消息響應函數中,我們將其和一個打開文件對話框聯繫起來,那麼首先需要設置一個過濾器,TCHAR szFilter[]=_T(“圖片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||”);然後就要在消息響應函數中創建一個文件對話框對象:CFileDialog fileDlg(TRUE,_T(“jpg”),NULL,0,szFilter,this);有了這個之後,這個按鈕就會打開一個文件對話框,我們一般打開文件對話框,從裏面選一個文件,然後點打開其實是獲取這個文件的路徑信息,那麼我們就需要建立一個變量來存儲這個文件的路徑信息,在MFC中有CString類型:CString strFilePath;然後去檢測,如果選擇了一個文件,並且點擊文件對話框中的確定按鈕,則將選中的文件的路徑信息存儲到剛剛建立的CString變量中,if(IDOK==fileDlg.DoModal()){strFilePath=fileDlg.GetPathName();

這個strFilePath變量中就存儲了我們選擇的文件的路徑信息了。

但是因爲這個我們得到的路徑信息是CString類型的,這在OpenCV中我們通過圖像路徑信息載入圖像一般都是通過char*類型的路徑信息,那麼我們怎麼把CString類型的變量轉換爲我們所需要的char*類型呢?這裏我們可以用到這樣的一條語句: string file_name = CT2A((LPCTSTR)strFilePath);這樣我們首先將CString類型轉換爲string類型的,然後將string轉換爲char*類型的就簡單了:constcahr* path_name=file_name.c_str();這條語句直接就完成了從string類型到char*類型的轉換了,那麼接下來我們就可以把這個路徑信息的圖像載入一個IplImage對象中了,接下來的圖像顯示和上面的一樣了。

發佈了50 篇原創文章 · 獲贊 86 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章