OPENCV筆記都是記錄MFC下做影像處理的項目時,遇到的問題,留此部落格以備記錄。
本文主要是需要開啟一個對話方塊,手動選取圖片,顯示在MFC的picture control上。關於在程式中使用絕對路徑讀取圖片的代碼,這裡直接給出,不做過多的說明了。
OpenCV使用絕對路徑讀取圖片:
void CMyDlg::OnBnClickedBtnloadimg(){// TODO: 在此添加控制項通知處理常式代碼IplImage *SrcImg;SrcImg = cvLoadImage("c:\\users\\administrator\\desktop\\1.jpg");//使用絕對路徑讀取圖片//SrcImg = cvLoadImage(".\\1.jpg"); //表示從當前檔案夾下讀取if (!SrcImg->imageData){AfxMessageBox("cvLoadImage() err");//使用多位元組字元集//AfxMessageBox(_T("cvLoadImage() err")); //使用Unicode字元集}if (SrcImg->nChannels != 1)//如果不是灰階圖,轉換成灰階圖{IplImage *GrayImg = cvCreateImage(cvGetSize(SrcImg), IPL_DEPTH_8U, 1);cvCvtColor(SrcImg, GrayImg, CV_BGR2GRAY);}else{cvReleaseImage(&GrayImg);GrayImg = SrcImg;}/*picture control顯示圖片,picture control的ID為IDC_ShowSrcImg*///擷取IDC_STATIC控制項的裝置環境,以便對其進行映像操作CDC* pDCSrc = GetDlgItem(IDC_ShowSrcImg)->GetDC();//獲得顯示空間的DC,MFC類一般都是以C開頭HDC hDCSrc = pDCSrc->GetSafeHdc();//得到hDC控制代碼進行繪圖操作CvvImage cimgsrc;cimgsrc.CopyOf(GrayImg);//將映像顯示到IDC_ShowImgSrc控制項上CRect rectsrc;GetDlgItem(IDC_ShowSrcImg)->GetClientRect(&rectsrc);cimgsrc.DrawToHDC(hDCSrc, &rectsrc);// 釋放ReleaseDC(pDCSrc);}
OpenCV彈出對話方塊,選擇圖片進行顯示:
void CMyDlg::OnBnClickedBtnopenimg(){// TODO: 在此添加控制項通知處理常式代碼IplImage* SrcImg = NULL;CFileDialog dlg(TRUE, _T("*.bmp;*.jpg;*.tif"), NULL,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,"image files All Files (*.*) |*.*||", NULL);// 選項圖片的約定; dlg.m_ofn.lpstrTitle = _T("開啟圖片");// 開啟檔案對話方塊的標題名;(*.bmp; *.jpg) |*.bmp; *.jpg | if (dlg.DoModal() == IDOK)// 判斷是否獲得圖片; {if (dlg.GetFileExt() != "bmp" && dlg.GetFileExt() != "jpg"&&dlg.GetFileExt() != "tif"){AfxMessageBox(_T("請選擇正確的圖片格式。"), MB_OK);return;}CString mPath = dlg.GetPathName();// 擷取圖片路徑; SrcImg = cvLoadImage(mPath);//讀取圖片、緩衝到一個局部變數ipl中; if (!SrcImg)// 判斷是否成功載入圖片; return;}/*picture control顯示圖片,picture control的ID為IDC_ShowSrcImg*///擷取IDC_STATIC控制項的裝置環境,以便對其進行映像操作CDC* pDCSrc = GetDlgItem(IDC_ShowSrcImg)->GetDC();//獲得顯示空間的DC,MFC類一般都是以C開頭HDC hDCSrc = pDCSrc->GetSafeHdc();//得到hDC控制代碼進行繪圖操作CvvImage cimgsrc;cimgsrc.CopyOf(SrcImg);//將映像顯示到IDC_ShowImgSrc控制項上CRect rectsrc;GetDlgItem(IDC_ShowSrcImg)->GetClientRect(&rectsrc);cimgsrc.DrawToHDC(hDCSrc, &rectsrc);// 釋放ReleaseDC(pDCSrc);}