版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國茶葉筒行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報(bào)告
- 2024-2030年中國茯神市場銷售格局與未來價(jià)格走勢預(yù)測研究報(bào)告
- 2024-2030年中國芋泥市場消費(fèi)渠道與前景營銷推廣規(guī)模調(diào)研報(bào)告
- 2024-2030年中國色覺傳感器市場營銷策略與未來經(jīng)營風(fēng)險(xiǎn)分析報(bào)告
- 2024-2030年中國自動(dòng)駕駛汽車行業(yè)產(chǎn)銷規(guī)模與多元化經(jīng)營分析研究報(bào)告
- 2024-2030年中國自動(dòng)移液管行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報(bào)告
- 2024-2030年中國膠合鑲花地板行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 2024-2030年中國肘部剛度處理行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 2024-2030年中國聚酰胺(PA)合金投資方向趨勢與發(fā)展態(tài)勢風(fēng)險(xiǎn)報(bào)告
- 天津市和平區(qū)2025屆高三下學(xué)期模擬試題(二)化學(xué)試題含解析
- 《原子的構(gòu)成與相對原子質(zhì)量》教學(xué)設(shè)計(jì)
- 內(nèi)分泌與代謝性疾病病人護(hù)理概述課件
- 初級(jí)中學(xué)理化生實(shí)驗(yàn)室建設(shè)標(biāo)準(zhǔn)
- 語文教師師徒結(jié)對師傅計(jì)劃4篇
- 部編版六年級(jí)上冊習(xí)作《我的拿手好戲》課件
- 中小學(xué)德育工作評價(jià)細(xì)則
- 幼兒園安全管理網(wǎng)絡(luò)圖
- 大學(xué)英語精讀第一冊(第三版)答案
- 水稻田間產(chǎn)量驗(yàn)收表
- 中職英語基礎(chǔ)模塊授課教案Unit3CampusLife
- 現(xiàn)場變更工程量確認(rèn)單
評論
0/150
提交評論