OpenCV入門:在MFC中使用Picture控件加載任意圖片
對於剛剛接觸OpenCV的童鞋來說,如何在MFC中加載並顯示一張圖片、應該是初期必定會碰到的問題之一。因此本文在分享這方面經驗的同時,也相當於是寫給自己的一份備忘錄。
本文使用的是OpenCV2.1+VS2008(當然,就本文所述內容而言,支持所有版本OpencCV),至於opencv在VS中的配置方法,本文不作詳述。
開門見山,本文核心思路是:使用OpenCV的庫函數加載圖片,並調用ShowImage()函數將其顯示到Picture控件上。
操作步驟如下:
1. 新建一個基於對話框的MFC程序(姑且命名為myImage),並添加一個Picture控件到對話框中,修改ID號為:IDC_STATIC_PIC。為使Picture控件更美觀,可將其屬性設置為:Client Edge:True。
2. 添加按鈕,可命名為“加載圖像”,修改ID號為ID_BUTTON_IMG。雙擊按鈕,跳到myImageDlg.cpp文件,開始編輯按鈕消息響應函數。該按鈕功能為加載圖片並顯示到Picture控件上。
void CmyPointerRecognitionDlg::OnBnClickedButtonDetect()
{
// TODO: Add your control notification handler code here
CString m_strPicPath;
IplImage* TheImage;
CFileDialog dlg(true,_T("*.bmp"),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
_T("image file(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*|"),NULL); //彈出選擇圖片對話框
dlg.m_ofn.lpstrTitle=_T("open Image");
if(dlg.DoModal()!=IDOK)
return ;
m_strPicPath = dlg.GetPathName();
m_strPicPath.Replace(_T("//"),_T("////"));
TheImage=cvLoadImage((CT2CA)m_strPicPath,1);
if(TheImage!=NULL)
{
ShowImage(TheImage, IDC_STATIC_PIC);
}
}
3. 注意在myImage.cpp和myImage.h中添加頭文件:#include<cv.h>和#include<highgui.h> 為方便編程最好加上:using namespace cv;
4. 在解決方案的類視圖(Class View)中右鍵單擊CmyImageDlg類,選擇“添加”->“添加成員函數”,在彈出的對話框中輸入相應內容 函數類型:void,函數名:ShowImage ,成員變量:IplImage* img 和 UINT ID。點擊“完成”,開始編輯函數體:
void CmyImageDlg::ShowImage(IplImage* img, UINT ID)
{
CDC* pDC=GetDlgItem(ID)->GetDC();
HDC hDC=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
SetRect(rect,rect.left,rect.top,rect.right,rect.bottom);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hDC,&rect);
ReleaseDC(pDC);
}
5. Ctrl+F5,編譯運行,即可實現預期效果。