OPENCV在MFC中的使用_第1頁
OPENCV在MFC中的使用_第2頁
OPENCV在MFC中的使用_第3頁
OPENCV在MFC中的使用_第4頁
OPENCV在MFC中的使用_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、OpenCV 在 MFC 中的一些基本使用方法在 OpenCV 教程 -基礎(chǔ)篇 的中, 所創(chuàng)建的 MFC 圖像顯示是直接放在對話框面板的左上角的, 感覺不大美觀; MFC 中快速應(yīng)用 OpenCV 則是介紹用 SDI (單文檔界面 來顯示圖像, A step-by-step guide to the use of Microsoft Visual C+and the Intel OpenCV library 使用 VS2005來進(jìn)行圖像和視頻的讀取和處理,但是其圖像和視頻 的顯示界面不是在對話框里面的,而是新建一個(gè)窗口來做。所以下面我們就來看看怎么在對話框里使用 Picture 控件 來顯示和

2、處理圖像。一、創(chuàng)建 MFC首先創(chuàng)建一個(gè) MFC 對話框應(yīng)用程序(Dialog-based Application 如下: 在 VS2005和 2008里,我們可以用一個(gè) Solution 來組合幾個(gè) Project (每個(gè) Project 基本上只包含一個(gè) Program ,當(dāng)我們要構(gòu)建一個(gè)多 Program 的應(yīng)用時(shí)(例如一個(gè)客戶端程序加一個(gè)服務(wù)器應(yīng)用程序 ,利用 Solution 可以將這些 Projects 組合起來、并且共享文件和函數(shù)庫。通常需要為 Solution 創(chuàng)建一個(gè)主路徑,其中包含了所有 Projects 的路徑。不過在這篇文章里,我們只構(gòu)建一個(gè)簡單的 Project ,所以

3、在創(chuàng)建 MFC 的 New Project 對話框里, 不用勾選 “Create directory for solution” 這個(gè)選項(xiàng)。點(diǎn)擊 OK -Next 進(jìn)入下一步,在這里我們創(chuàng)建一個(gè) Dialog-based Application ,大部分選項(xiàng)按默認(rèn)設(shè)置就行,不過 最下面的 “Use Unicode libraries” 最好去掉。如果勾選了這個(gè)選項(xiàng),程序代碼就會(huì)使用 16bit 的 Unicode 字符集來 編碼,但是很多函數(shù)雖然使用 char*(ASCIIstings 類型字符,而將字符串從 Unicode 轉(zhuǎn)換到 ASCII 是非常麻 煩的。使用 Unicode 在編譯時(shí)可

4、能會(huì)遇到下列錯(cuò)誤:cannot convert parameter 1from 'CString' to 'const char *'cannot convert from 'const char 11'to 'LPCWSTR' 這意味著在 Unicode 和 Multi-byte 字符串的轉(zhuǎn)換中出 現(xiàn)了問題。在上一篇學(xué)習(xí)筆記中,就提到 “ 成員函數(shù) LoadBMP 其輸入?yún)?shù)類型應(yīng)為 const char*” ,那應(yīng)該只是一個(gè) 治標(biāo)的方法,這里的去掉 “Use Unicode libraries” 選項(xiàng),才是治本之道。往后的幾步

5、設(shè)置,可以根據(jù)自己的需要來操作,我的設(shè)置如下: 二、編寫代碼在 Resource View 面板 ->mymfc(工程名稱 ->mymfc.rc->Dialog雙擊 IDD_MYMFC_DIALOG,可以看到一 個(gè)初始的 GUI 界面,往里面添加兩個(gè) Button 和 一個(gè) Picture 控件,如下: 選中單個(gè)控件、 右擊選擇屬性 (Properties , 可以看到控件的 ID 號(hào), 這個(gè)號(hào)可以自行編輯, 例如 Picture 控件的 ID 號(hào)我設(shè)置為 IDC_ShowImg,這個(gè) ID 號(hào)在后面的圖像顯示函數(shù)中要用到。首先在項(xiàng)目屬性中加載 lib 文件:菜單 Proje

6、ct ->Properties ->Configuration Properties ->Linker >Input ->additional dependencies 中加入 cxcore200.lib cv200.lib highgui200.lib 。然后在 mymfc.h 的 #include"resource.h" 下加入如下代碼:#include"cv.h"#include"highgui.h"#defineIMAGE_WIDTH256#defineIMAGE_HEIGHT256#define

7、IMAGE_CHANNELS3在 Class View 面板右擊 CmymfcDlg ,選擇 Add >Add Variable ,添加一個(gè) IplImage*類型的變量 TheImage ; 再點(diǎn)擊 CmymfcDlg , 在下面窗口的列表中雙擊 OnInitDialog , 在 “/TODO: Add extra initialization here” 下面添加 TheImage 的初始化代碼:CvSize ImgSize;ImgSize.height =IMAGE_HEIGHT;ImgSize.width =IMAGE_WIDTH;TheImage =cvCreateImage(

8、ImgSize, IPL_DEPTH_8U,IMAGE_CHANNELS; 然后雙擊 OnPaint ,在 if(IsIconic( 的 else 里添加以下代碼,用來重繪窗口:CDialog:OnPaint(;/重繪對話框CDialog:UpdateWindow(;/更新 windows 窗口, 如果無這步調(diào)用, 圖片顯示還會(huì)出現(xiàn)問題 ShowImage(TheImage, IDC_ShowImg; /重繪圖片函數(shù)接著在 CmymfcApp 下面的成員列表中 雙擊 InitInstance ,在兩個(gè) “/TODO:Place code here to handle when the dial

9、og is” 下面添加: cvReleaseImage(&dlg.TheImage; 即按下 “OK” 或 “Cancel” 時(shí),釋放 TheImage 占用的內(nèi)存。接下來就是寫讀取和處理圖片的功能函數(shù)了?;氐?mymfc 的 GUI 編輯界面中,右擊按鈕 ReadImg ,選擇 Add Event Handler ,建立按鈕點(diǎn)擊的消息響應(yīng)程 序: 句柄名設(shè)置為 OnBnClickedReadimg ,主要的響應(yīng)操作包括 彈出對話框選擇圖片文件、讀入圖片文件、對圖片統(tǒng)一 縮放至 256*256的大小、顯示圖像,代碼如下:/TODO:Add your control notificati

10、on handler code hereCFileDialog dlg(TRUE, _T("*.bmp",NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T("imagefiles (*.bmp;*.jpg|*.bmp;*.jpg|All Files (*.*|*.*|",NULL; /選項(xiàng)圖片的約定if(dlg.DoModal(!=IDOK /判斷是否獲得圖片return;CString mPath =dlg.GetPathName(;/獲取圖片路徑IplImage*ipl =cvL

11、oadImage(mPath, 1; /讀取圖片、緩存到一個(gè)局部變量 ipl 中if(!ipl /判斷是否成功載入圖片return;if(TheImage /對上一幅顯示的圖片數(shù)據(jù)清零cvZero(TheImage ;ResizeImage(ipl ; /對讀入的圖片進(jìn)行縮放,使其寬或高最大值者剛好等于 256,再復(fù)制到 TheImage 中ShowImage(TheImage, IDC_ShowImg; /調(diào)用顯示圖片函數(shù)cvReleaseImage(&ipl; /釋放 ipl 占用的內(nèi)存其中包含了兩個(gè)新的成員函數(shù) ResizeImage 和 ShowImage ,前者的作用是對讀入

12、的不同大小的圖像進(jìn)行縮放,再通過設(shè)置 ROI 的方式將圖像 存入 256*256的 TheImage 中; 后者是將圖像 TheImage 顯示到圖片顯示控件 IDC_ShouImg窗口的正中部 位。為了實(shí)現(xiàn)這兩個(gè)功能,首先在 Class View 面板右擊 CmymfcDlg ,選擇 Add >Add Function ,創(chuàng)建兩個(gè)函 數(shù):void ShowImage(IplImage*img, UINT ID 和 void ResizeImage(IplImage*img 。以下是這兩個(gè)函 數(shù)的實(shí)現(xiàn)代碼:void CmymfcDlg:ResizeImage(IplImage*img/讀

13、取圖片的寬和高int w =img->width;int h =img->height;/找出寬和高中的較大值者int max =(w>h? w:h;/計(jì)算將圖片縮放到 TheImage 區(qū)域所需的比例因子float scale =(float(floatmax /256.0f ;/縮放后圖片的寬和高int nw =(int(w/scale;int nh =(int(h/scale;/為了將縮放后的圖片存入 TheImage 的正中部位,需計(jì)算圖片在 TheImage 左上角的期望坐標(biāo)值int tlx =(nw>nh? 0:(int(256-nw/2;int tly =

14、(nw>nh? (int(256-nh/2:0;/設(shè)置 TheImage 的 ROI 區(qū)域,用來存入圖片 imgcvSetImageROI(TheImage, cvRect(tlx, tly, nw, nh ;/對圖片 img 進(jìn)行縮放,并存入到 TheImage 中cvResize(img, TheImage ;/重置 TheImage 的 ROI 準(zhǔn)備讀入下一幅圖片cvResetImageROI(TheImage ;void CmymfcDlg:ShowImage(IplImage*img, UINT ID /ID 是 Picture Control 控件的 ID 號(hào) CDC*pDC

15、 =GetDlgItem(ID ->GetDC(;/獲得顯示控件的 DCHDC hDC =pDC ->GetSafeHdc(;/獲取 HDC(設(shè)備句柄 來進(jìn)行繪圖操作CRect rect;GetDlgItem(ID->GetClientRect(▭int rw =rect.right -rect.left; /求出圖片控件的寬和高int rh =rect.bottom -rect.top;int iw =img->width;/讀取圖片的寬和高int ih =img->height;int tx =(int(rw-iw/2;/使圖片的顯示位置正好

16、在控件的正中int ty =(int(rh-ih/2;SetRect(rect, tx, ty, tx+iw,ty+ih;CvvImage cimg;cimg.CopyOf(img ; /復(fù)制圖片cimg.DrawToHDC(hDC, ▭ /將圖片繪制到顯示控件的指定區(qū)域內(nèi)ReleaseDC(pDC ;函數(shù) ResizeImage 是參考了學(xué)習(xí)筆記(5中單窗口顯示多幅圖像的函數(shù) cvShowMultiImages 修改而成的,函 數(shù) ShowImage 則是參考了帖子 OpenCV 如何把圖像顯示到 MFC 的 picture 控件上的代碼,另外下面幾個(gè)帖 子也可以參考:1、

17、 MFC picture control 畫框的問題2、 MFC picture control 控件實(shí)現(xiàn)(隱藏文字顯示3、 MFC 在 Picture Control 中顯示圖片 (jpg遇到的問題4、 vc 怎樣在 picture control 中顯示 jpg,jif,bmp 格式圖象5、 使用 Picture Control 顯示 BMP 圖片 最后是要對讀入的圖像做簡單的 Canny 邊緣處理,為此,建立一個(gè)按鈕 EdgeDetect,相應(yīng)的響應(yīng)代碼如下: void CmymfcDlg:OnBnClickedEdgedetect( / TODO: Add your control n

18、otification handler code here IplImage *gray = 0, *edge = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT, IPL_DEPTH_8U, 1 ; edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT, IPL_DEPTH_8U, 1 ; cvCvtColor( TheImage, gray, CV_BGR2GRAY ; cvCanny( gray, edge, 30, 100, 3 ; cvCvtColor( edge, TheImage, CV_GRAY2BGR ; ShowImage( TheImage, IDC_ShowImg ; / 調(diào)用顯示圖片函數(shù) cvReleaseImage( &gray ; cvReleaseImage( &edge ; 這里主要是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論