【OpenCV2】MFC中用OPENCV如何將圖片顯示在指定位置?
阿新 • • 發佈:2019-02-16
在opencv在開發過程中,我想最頻繁的操作(之一)莫過於顯示圖片了。
學過OpenCV的同學都知道,呼叫cv::imshow()(或者C版本的ShowImage())可以輕而易舉的將圖片顯示出來。
但是,它會建立一個不這麼協調的對話方塊來顯示這個圖片,那麼在MFC中我們如何讓圖片顯示在指定的位置上呢?
先給個結果圖(我使用的是VS2010+OpenCV2.4.8):
第一步:
建立一個基於MFC的基本對話方塊框架了、配置OpenCV環境
第二步:(如果是使用2.2版本以下的跳過)
我們要使用一個非常重要的類CVVImage(注意不是w,而是兩個V),而該類定義在CVVImage定義在CvvImage.h檔案上,不過OpenCV2.2以後的版本把它給拋棄了,所以為了能使用該類,我們找到包含該類的檔案CvvImage.h和CvvImage.cpp將它們新增到你的工程裡面(這就是開源的其中一個好處)
第三步:
在你的主對話方塊上面新增一個圖片控制元件(Picture Control),然後可以修改圖片的ID為IDC_SHOWIMAGE
第四步:
在工程目錄下新增一張圖片,命名為:test.jpg
第五步:
新增一個按鈕,用來控制圖片的顯示,在按鈕響應函式裡面新增如下程式碼:
給對話方塊類新增showimage函式,函式實現如下(因為使用cv::Mat最終要轉換為IplImage格式,所以這裡只給出引數為cv::Mat 的函式):void CShowImageDlg::OnBnClickedButtonShow() { // TODO: 在此新增控制元件通知處理程式程式碼 cv::Mat image = cv::imread("test.jpg"); if (!image.empty()) { showimage(image,IDC_SHOWIMAGE); } }
/*================================================================ * * 函式原型:void showimage(cv::Mat& image,int IDC); * * 參 數:cv::Mat &image -- 要顯示的影象 * int IDC -- 顯示影象的影象控制元件的ID * * 功能描述: 將影象顯示在對應的影象控制元件上 * * * 返 回 值:無 * * 丟擲異常:無 * * 作 者:黃凱煥 * ================================================================*/ void CShowImageDlg::showimage(cv::Mat& image,int IDC) { CDC* pDC=GetDlgItem(IDC)->GetDC(); //根據ID獲得視窗指標再獲取與該視窗關聯的上下文指標 HDC hDC=pDC->GetSafeHdc(); // 獲取裝置上下文控制代碼 CRect rect; GetDlgItem(IDC)->GetClientRect(&rect); //獲取顯示區 IplImage* img=&image.operator IplImage(); //將影象轉換為IplImage格式,共用同一個記憶體(淺拷貝) CvvImage iimg; //建立一個CvvImage物件 iimg.CopyOf(img); iimg.DrawToHDC(hDC,&rect); ReleaseDC( pDC ); iimg.Destroy(); }
注意,要將showimage作為對話方塊的成員函式
嘿嘿,很簡單吧。
(工程不知道怎麼連結上來,求有經驗的朋友賜教)