圖像處理opencv代碼_第1頁
圖像處理opencv代碼_第2頁
圖像處理opencv代碼_第3頁
圖像處理opencv代碼_第4頁
圖像處理opencv代碼_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

...wd......wd......wd...#include"stdafx.h"#include"mymfc.h"#include"mymfcDlg.h"#include"afxdialogex.h"#include<opencv2/opencv.hpp>#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于應用程序“關于〞菜單項的CAboutDlg對話框classCAboutDlg:publicCDialogEx{public: CAboutDlg();//對話框數(shù)據(jù) enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//實現(xiàn)protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//CmymfcDlg對話框CmymfcDlg::CmymfcDlg(CWnd*pParent/*=NULL*/) :CDialogEx(CmymfcDlg::IDD,pParent) ,TheImage(NULL) ,rePath(_T("")){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCmymfcDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CmymfcDlg,CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg,&CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect,&CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh,&CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess,&CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel,&CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace,&CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2,&CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage,&CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror,&CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor,&CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur,&CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian,&CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide,&CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally,&CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion,&CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate,&CmymfcDlg::OnBnClickedDilate)END_MESSAGE_MAP()//CmymfcDlg消息處理程序BOOLCmymfcDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); //將“關于...〞菜單項添加到系統(tǒng)菜單中。 CvSizeImgSize; ImgSize.height=IMAGE_HEIGHT; ImgSize.width=IMAGE_WIDTH; TheImage=cvCreateImage(ImgSize,IPL_DEPTH_8U,IMAGE_CHANNELS); //IDM_ABOUTBOX必須在系統(tǒng)命令范圍內。 ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { BOOLbNameValid; CStringstrAboutMenu; bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動 //執(zhí)行此操作 SetIcon(m_hIcon,TRUE); //設置大圖標 SetIcon(m_hIcon,FALSE); //設置小圖標 //TODO:在此添加額外的初始化代碼 returnTRUE;//除非將焦點設置到控件,否則返回TRUE}voidCmymfcDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID,lParam); }}//如果向對話框添加最小化按鈕,則需要下面的代碼//來繪制該圖標。對于使用文檔/視圖模型的MFC應用程序,//這將由框架自動完成。voidCmymfcDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//用于繪制的設備上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使圖標在工作區(qū)矩形中居中 intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //繪制圖標 dc.DrawIcon(x,y,m_hIcon); } else { CDialogEx::OnPaint(); CDialog::OnPaint(); //重繪對話框 CDialog::UpdateWindow(); //更新windows窗口,如果無這步調用,圖片顯示還會出現(xiàn)問題 //ShowImage(TheImage,IDC_ShowImg); //重繪圖片函數(shù) }}//當用戶拖動最小化窗口時系統(tǒng)調用此函數(shù)取得光標//顯示。HCURSORCmymfcDlg::OnQueryDragIcon(){ returnstatic_cast<HCURSOR>(m_hIcon);}voidCmymfcDlg::OnBnClickedReadimg()//讀取圖片操作{ //TODO:在此添加控件通知處理程序代碼 //這里用CFileDialog來選擇圖片 CFileDialogdlg( TRUE,_T("*.bmp"),NULL, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, _T("AllFiles(*.*)|*.*|imagefiles(*.bmp;*.jpg)|*.bmp;*.jpg||"),NULL ); //翻開文件對話框的標題名 dlg.m_ofn.lpstrTitle=_T("OpenImage"); //判斷是否獲得圖片 if(dlg.DoModal()!=IDOK) return; //獲取圖片路徑 CStringmPath=dlg.GetPathName(); rePath=mPath; //讀取圖片 IplImage*ipl=cvLoadImage(mPath,1); //判斷是否成功讀取圖片 if(!ipl) return; if(TheImage) cvZero(TheImage); ResizeImage(ipl); ShowImage(TheImage,IDC_ShowImg); cvReleaseImage(&ipl);}voidCmymfcDlg::ShowImage(IplImage*img,UINTID)//ID是PictureControl控件的ID號{ //獲得顯示控件的DC CDC*pDC=GetDlgItem(ID)->GetDC(); //獲取HDC(設備句柄)來進展繪圖操作 HDChDC=pDC->GetSafeHdc(); CRectrect; GetDlgItem(ID)->GetClientRect(&rect); //求出圖片控件的寬和高 intrw=rect.right-rect.left; intrh=rect.bottom-rect.top; //讀取圖片的寬和高 intiw=img->width; intih=img->height; //使圖片的顯示位置正好在控件的正中 inttx=(int)(rw-iw)/2; intty=(int)(rh-ih)/2; SetRect(rect,tx,ty,tx+iw,ty+ih); //復制圖片 CvvImagecimg; cimg.CopyOf(img); //將圖片繪制到顯示控件的指定區(qū)域內 cimg.DrawToHDC(hDC,&rect); ReleaseDC(pDC);}voidCmymfcDlg::ResizeImage(IplImage*img){ //讀取圖片的寬和高 intw=img->width; inth=img->height; //找出寬和高中的較大值者 intmax=(w>h)?w:h; //計算將圖片縮放到TheImage區(qū)域所需的比例 floatscale=(float)((float)max/256.0f); //縮放后圖片的寬和高 intnw=(int)(w/scale); intnh=(int)(h/scale); //為了將縮放后的圖片存入TheImage的正中部位,需計算圖片在TheImage左上角的期望坐標值 inttlx=(nw>nh)?0:(int)(256-nw)/2; inttly=(nw>nh)?(int)(256-nh)/2:0; //設置TheImage的ROI區(qū)域,用來存入圖片img cvSetImageROI(TheImage,cvRect(tlx,tly,nw,nh)); //對圖片img進展縮放,并存入到TheImage中 cvResize(img,TheImage); //重置TheImage的ROI準備讀入下一幅圖片 cvResetImageROI(TheImage);}voidCmymfcDlg::OnBnClickedEdgedetect()//Canny算法的邊緣檢測{ //TODO:在此添加控件通知處理程序代碼 IplImage*gray=0,*edge=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);edge=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_BGR2GRAY);cvCanny(gray,edge,30,100,3);ShowImage(edge,IDC_ShowImg);//調用顯示圖片函數(shù)cvReleaseImage(&gray);cvReleaseImage(&edge);}voidCmymfcDlg::OnBnClickedRefresh()//恢復圖片{ //TODO:在此添加控件通知處理程序代碼 //將讀入的圖片路徑傳給mPath CStringmPath=rePath; //讀取圖片、緩存到一個局部變量ipl中 IplImage*ipl=cvLoadImage(mPath,1); //判斷是否成功讀取圖片 if(!ipl) return; //對上一幅顯示的圖片數(shù)據(jù)清零 if(TheImage) cvZero(TheImage); //對讀入的圖片進展縮放,使其寬或高最大值者剛好等于256,再復制到TheImage中 ResizeImage(ipl); //調用顯示圖片函數(shù) ShowImage(TheImage,IDC_ShowImg);}voidCmymfcDlg::OnBnClickedGrayprocess()//灰度圖像的轉化{ //TODO:在此添加控件通知處理程序代碼 IplImage*gray=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_RGB2GRAY); ShowImage(gray,IDC_ShowImg); //釋放圖片的內存空間 cvReleaseImage(&gray);}voidCmymfcDlg::OnBnClickedSobel()//用cvSobel函數(shù)的邊緣檢測{ //TODO:在此添加控件通知處理程序代碼 IplImage*gray=0,*edge=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);edge=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_BGR2GRAY);cvSobel(gray,edge,1,0,3);ShowImage(edge,IDC_ShowImg);//調用顯示圖片函數(shù) cvReleaseImage(&gray);cvReleaseImage(&edge);}voidCmymfcDlg::OnBnClickedLaplace()//用cvLaplace函數(shù)實現(xiàn)圖像的拉普拉斯變換{ //TODO:在此添加控件通知處理程序代碼 IplImage*gray=0,*edge=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);edge=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_BGR2GRAY);cvLaplace(gray,edge,3);ShowImage(edge,IDC_ShowImg);//調用顯示圖片函數(shù) cvReleaseImage(&gray);cvReleaseImage(&edge);}voidCmymfcDlg::fft2(IplImage*src,IplImage*des)//傅里葉正變換方法{ //實部、虛部 IplImage*image_Re=0,*image_Im=0,*Fourier=0; //inti,j; image_Re=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);//實部 //Imaginarypart image_Im=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);//虛部 //2channels(image_Re,image_Im) Fourier=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2); //Realpartconversionfromu8to64f(double) cvConvertScale(src,image_Re,1,0); //Imaginarypart(zeros) cvZero(image_Im); //JoinrealandimaginarypartsandstocktheminFourierimage cvMerge(image_Re,image_Im,0,0,Fourier); //ApplicationoftheforwardFouriertransform cvDFT(Fourier,des,CV_DXT_FORWARD); cvReleaseImage(&image_Re); cvReleaseImage(&image_Im); cvReleaseImage(&Fourier);}voidCmymfcDlg::OnBnClickedFft2(){ //TODO:在此添加控件通知處理程序代碼 IplImage*src;//源圖像 IplImage*Fourier;//傅里葉系數(shù) IplImage*dst; IplImage*ImageRe; IplImage*ImageIm; IplImage*Image; IplImage*ImageDst; doublem,M; doublescale; doubleshift; src=cvLoadImage(rePath,0);//加載源圖像,第二個參數(shù)表示將輸入的圖片轉為單信道 Fourier=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2); dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2); ImageRe=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1); ImageIm=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1); Image=cvCreateImage(cvGetSize(src),src->depth,src->nChannels); ImageDst=cvCreateImage(cvGetSize(src),src->depth,src->nChannels); fft2(src,Fourier);//傅里葉變換 fft2shift(Fourier,Image);//中心化 //cvDFT(Fourier,dst,CV_DXT_INV_SCALE);//實現(xiàn)傅里葉逆變換,并對結果進展縮放 cvSplit(dst,ImageRe,ImageIm,0,0); cvPow(ImageRe,ImageRe,2); cvPow(ImageIm,ImageIm,2); cvAdd(ImageRe,ImageIm,ImageRe,NULL); cvPow(ImageRe,ImageRe,0.5); cvMinMaxLoc(ImageRe,&m,&M,NULL,NULL); scale=255/(M-m); shift=-m*scale; //將shift加在ImageRe各元素按比例縮放的結果上,存儲為ImageDst //cvConvertScale(ImageRe,ImageDst,scale,shift); cvNamedWindow("傅里葉譜",0); cvShowImage("傅里葉譜",Image); cvReleaseImage(&src); cvReleaseImage(&Image); cvReleaseImage(&ImageIm); cvReleaseImage(&ImageRe); cvReleaseImage(&Fourier); cvReleaseImage(&dst); cvReleaseImage(&ImageDst);}voidCmymfcDlg::fft2shift(IplImage*src,IplImage*dst)//傅里葉變換{ IplImage*image_Re=0,*image_Im=0; intnRow,nCol,i,j,cy,cx; doublescale,shift,tmp13,tmp24; image_Re=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1); //Imaginarypart image_Im=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1); cvSplit(src,image_Re,image_Im,0,0); //ComputethemagnitudeofthespectrumMag=sqrt(Re^2+Im^2) //計算傅里葉譜 cvPow(image_Re,image_Re,2.0); cvPow(image_Im,image_Im,2.0); cvAdd(image_Re,image_Im,image_Re); cvPow(image_Re,image_Re,0.5); //對數(shù)變換以增強灰度級細節(jié)(這種變換使以窄帶低灰度輸入圖像值映射 //Computelog(1+Mag); cvAddS(image_Re,cvScalar(1.0),image_Re);//1+Mag cvLog(image_Re,image_Re);//log(1+Mag) //RearrangethequadrantsofFourierimagesothattheoriginisattheimagecenter nRow=src->height; nCol=src->width; cy=nRow/2;//imagecenter cx=nCol/2; //進展中心變換 for(j=0;j<cy;j++){ for(i=0;i<cx;i++){ //中心化,將整體份成四塊進展對角交換 tmp13=CV_IMAGE_ELEM(image_Re,double,j,i); CV_IMAGE_ELEM(image_Re,double,j,i)=CV_IMAGE_ELEM( image_Re,double,j+cy,i+cx); CV_IMAGE_ELEM(image_Re,double,j+cy,i+cx)=tmp13; tmp24=CV_IMAGE_ELEM(image_Re,double,j,i+cx); CV_IMAGE_ELEM(image_Re,double,j,i+cx)= CV_IMAGE_ELEM(image_Re,double,j+cy,i); CV_IMAGE_ELEM(image_Re,double,j+cy,i)=tmp24; } } //歸一化處理將矩陣的元素值歸一為[0,255] //[(f(x,y)-minVal)/(maxVal-minVal)]*255 doubleminVal=0,maxVal=0; //Localizeminimumandmaximumvalues cvMinMaxLoc(image_Re,&minVal,&maxVal); //Normalizeimage(0-255)tobeobservedasanu8image scale=255/(maxVal-minVal); shift=-minVal*scale; cvConvertScale(image_Re,dst,scale,shift); cvReleaseImage(&image_Re); cvReleaseImage(&image_Im);}voidCmymfcDlg::OnBnClickedCimage()//圖片的反轉{ //TODO:在此添加控件通知處理程序代碼 IplImage*cImage=0; cImage=cvCloneImage(TheImage);//這里用克隆函數(shù)將原圖片復制給cImage //利用翻轉函數(shù)cvFlip〔〕將cImage反轉 cvFlip(cImage,NULL,0); ShowImage(cImage,IDC_ShowImg); cvReleaseImage(&cImage);}voidCmymfcDlg::OnBnClickedMirror()//圖像的鏡像{ //TODO:在此添加控件通知處理程序代碼 IplImage*cImage=0; cImage=cvCloneImage(TheImage);//這里用克隆函數(shù)將原圖片復制給cImage //利用翻轉函數(shù)cvFlip〔〕將cImage反轉 cvFlip(cImage,NULL,1); ShowImage(cImage,IDC_ShowImg); cvReleaseImage(&cImage);}voidCmymfcDlg::OnBnClickedCcolor()//圖像的反色{ //TODO:在此添加控件通知處理程序代碼 IplImage*cImage=0; cImage=cvCloneImage(TheImage);//這里用克隆函數(shù)將原圖片復制給cImage //利用函數(shù)cvNot〔〕將cImage每個像素點取反 cvNot(TheImage,cImage); ShowImage(cImage,IDC_ShowImg); cvReleaseImage(&cImage); }voidCmymfcDlg::OnBnClickedMedianblur()//非線性濾波之中值濾波{ //TODO:在此添加控件通知處理程序代碼 //灰度原始圖像 IplImage*gray=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_RGB2GRAY); IplImage*dstImage=0; dstImage=cvCloneImage(gray);//這里用克隆函數(shù)將sreImage圖片復制給dstImage cvSmooth(gray,dstImage,CV_MEDIAN,5,5); ShowImage(dstImage,IDC_ShowImg); cvReleaseImage(&gray); cvReleaseImage(&dstImage);}voidCmymfcDlg::OnBnClickedGaussian()//高斯濾波{ //TODO:在此添加控件通知處理程序代碼 //灰度原始圖像 IplImage*gray=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_RGB2GRAY); IplImage*dstImage=0; dstImage=cvCloneImage(gray);//這里用克隆函數(shù)將sreImage圖片復制給dstImage cvSmooth(gray,dstImage,CV_GAUSSIAN,5,5); ShowImage(dstImage,IDC_ShowImg); cvReleaseImage(&gray); cvReleaseImage(&dstImage);}voidCmymfcDlg::OnBnClickedBothside()//雙邊濾波{ //TODO:在此添加控件通知處理程序代碼 //灰度原始圖像 IplImage*gray=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_RGB2GRAY); IplImage*dstImage=0; dstImage=cvCloneImage(g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論