1. 程式人生 > >【OpenCV2】MFC中用OPENCV如何將圖片顯示在指定位置?

【OpenCV2】MFC中用OPENCV如何將圖片顯示在指定位置?

在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

第五步:

新增一個按鈕,用來控制圖片的顯示,在按鈕響應函式裡面新增如下程式碼:

void CShowImageDlg::OnBnClickedButtonShow()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	cv::Mat image = cv::imread("test.jpg");
	if (!image.empty())
	{
		showimage(image,IDC_SHOWIMAGE);
	}
}
給對話方塊類新增showimage函式,函式實現如下(因為使用cv::Mat最終要轉換為IplImage格式,所以這裡只給出引數為cv::Mat 的函式):
/*================================================================ 
 * 
 * 函式原型: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作為對話方塊的成員函式

嘿嘿,很簡單吧。

(工程不知道怎麼連結上來,求有經驗的朋友賜教)