參考博文 http://blog.sina.com.cn/s/blog_4d8730df0100mpzj.html http://blog.csdn.net/chenyusiyuan/article/details/4744097 本文是根據(jù)opencv246和VS2012在用MFC做圖像顯示時(shí)出現(xiàn)的問題做出解釋 一,、創(chuàng)建MFC 個(gè)選項(xiàng),程序代碼就會使用16bit的Unicode字符集來編碼,,但是很多函數(shù)雖然使用 char* (ASCII stings) 類型字符,,而將字符串從 Unicode 轉(zhuǎn)換到 ASCII 是非常麻煩的。使用 Unicode 在編譯時(shí)可能會遇到下列錯(cuò)誤: 二、編寫代碼 1 打開工程文件,,進(jìn)入資源視圖:LoadPicture(工程名稱)->LoadPicture.rc->Dialog雙擊IDD_LoadPicture_DIALOG,,可以看到一個(gè)初始的GUI界面,往里面添加兩個(gè) Button 和 一個(gè) Picture 控件 選中單個(gè)控件,、右擊選擇屬性(Properties),,可以看到控件的ID號,這個(gè)號可以自行編輯,,例如 Picture 控件的 ID 號我設(shè)置為 IDC_ShowImg,,這個(gè) ID 號在后面的圖像顯示函數(shù)中要用到。 2 將OpenCV庫加入到VS中,沒有配置會出錯(cuò)opencv246+VS2012的配置課參考本博文——VS2012配置OPENCV246 3 然后在 LoadPicture.h 的 #include "resource.h" 代碼行下面加入如下代碼: #include <opencv\cv.h> #include <opencv\highgui.h> #define IMAGE_WIDTH 256 #define IMAGE_HEIGHT 256 #define IMAGE_CHANNELS 3 4 在 類視圖面板右擊 CloadPictureDlg,,選擇 Add –> Add Variable,,添加一個(gè) IplImage* 類型的變量 TheImage;
再點(diǎn)擊 CLoadPictureDlg,,在下面窗口的列表中雙擊 OnInitDialog,,在// TODO: 在此添加額外的初始化代碼下面添加 TheImage 的初始化代碼:
CvSize ImgSize; ImgSize.height = IMAGE_HEIGHT; ImgSize.width = IMAGE_WIDTH; TheImage=cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS ); 5 然后雙擊 OnPaint,在 if(IsIconic())…的 else 里添加以下代碼,,用來重繪窗口: CDialog::OnPaint(); // 重繪對話框 CDialog::UpdateWindow(); // 更新windows窗口,,如果無這步調(diào)用,圖片顯示還會出現(xiàn)問題 ShowImage( TheImage, IDC_ShowImg ); // 重繪圖片函數(shù) 接著在 CtestPicControlApp 下面的成員列表中雙擊 InitInstance,,在兩個(gè)“// TODO: Place code here to handle when the dialog is…”下面添加: 即按下“OK”或“Cancel”時(shí),,釋放TheImage占用的內(nèi)存。
6 寫讀取和處理圖片的功能函數(shù),。 回到資源視圖,,雙擊按鈕 ReadImage,,,建立按鈕點(diǎn)擊的消息響應(yīng)程序:OnBnClickedReadimage,主要的響應(yīng)操作包括 彈出對話框選擇圖片文件,、讀入圖片文件、對圖片統(tǒng)一縮放至256*256的大小,、顯示圖像,,代碼如下:
7 在上面的代碼中包含了兩個(gè)新的成員函數(shù) ResizeImage 和 ShowImage,,前者的作用是對讀入的不同大小的圖像進(jìn)行縮放,,再通過設(shè)置 ROI 的方式將圖像存入 256*256 的 TheImage 中;后者是將圖像 TheImage 顯示到圖片顯示控件 IDC_ShouImg 窗口的正中部位,。為了實(shí)現(xiàn)這兩個(gè)功能,,首先在類視圖 面板右擊 CtestPicControlDlg,選擇 Add –> Add Function,,創(chuàng)建兩個(gè)函數(shù):void ShowImage( IplImage* img, UINT ID ) 和 void ResizeImage(IplImage* img),。以下是這兩個(gè)函數(shù)的實(shí)現(xiàn)代碼: 函數(shù)添加如下
注意 1:如果你的CvvImage出現(xiàn)紅色的底線提示沒有定義那說明你的opencv版本是比較新的里面的CvvImage函數(shù)已經(jīng)被去掉了,我的opencv246就沒有這個(gè)函數(shù),。只要在工程中加入CvvImage.h和CvvImage.cpp就可以了,。關(guān)于這兩個(gè)文件見本博客http://blog.csdn.net/lxy201700/article/details/16921715 2:如果你編譯后出現(xiàn)error C4996: 'fopen': This function or variable may be unsafe.的錯(cuò)誤提示說明的vs版本比較新,在VS2008中只是個(gè)warning,我的是VS2012的出現(xiàn)錯(cuò)誤文件生成失敗,。關(guān)于這個(gè)問題的解決見本博客http://blog.csdn.net/lxy201700/article/details/16921629 原文地址:http://blog.csdn.net/lxy201700/article/details/16921903 |
|