当前位置:文档之家› 图像处理opencv代码

图像处理opencv代码

#include "stdafx.h"#include "mymfc.h"#include "mymfcDlg.h"#include "afxdialogex.h"#include <opencv2/opencv.hpp>#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::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);}void CmymfcDlg::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 消息处理程序BOOL CmymfcDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。

CvSize ImgSize;ImgSize.height = IMAGE_HEIGHT;ImgSize.width = IMAGE_WIDTH;TheImage = cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。

当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void CmymfcDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。

对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。

void CmymfcDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();CDialog::OnPaint();// 重绘对话框CDialog::UpdateWindow();// 更新windows窗口,如果无这步调用,图片显示还会出现问题//ShowImage( TheImage, IDC_ShowImg );// 重绘图片函数}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。

HCURSOR CmymfcDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CmymfcDlg::OnBnClickedReadimg() //读取图片操作{// TODO: 在此添加控件通知处理程序代码// 这里用CFileDialog来选择图片CFileDialog dlg(TRUE, _T("*.bmp"), NULL,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,_T("All Files (*.*) |*.*|image files (*.bmp; *.jpg)|*.bmp; *.jpg ||"), NULL);// 打开文件对话框的标题名dlg.m_ofn.lpstrTitle = _T("Open Image");// 判断是否获得图片if( dlg.DoModal() != IDOK )return;// 获取图片路径CString mPath = dlg.GetPathName();rePath = mPath;// 读取图片IplImage* ipl = cvLoadImage( mPath, 1 );// 判断是否成功读取图片if( !ipl )return;if( TheImage )cvZero( TheImage );ResizeImage( ipl );ShowImage( TheImage,IDC_ShowImg);cvReleaseImage( &ipl );}void CmymfcDlg::ShowImage(IplImage* img, UINT ID) // ID 是Picture Control控件的ID号{// 获得显示控件的 DCCDC* pDC = GetDlgItem( ID ) ->GetDC();// 获取 HDC(设备句柄) 来进行绘图操作HDC hDC = pDC ->GetSafeHdc();CRect rect;GetDlgItem(ID) ->GetClientRect( &rect );// 求出图片控件的宽和高int rw = rect.right - rect.left;int rh = rect.bottom - rect.top;// 读取图片的宽和高int iw = img->width;int ih = img->height;// 使图片的显示位置正好在控件的正中int tx = (int)(rw - iw)/2;int ty = (int)(rh - ih)/2;SetRect( rect, tx, ty, tx+iw, ty+ih );// 复制图片CvvImage cimg;cimg.CopyOf( img );// 将图片绘制到显示控件的指定区域内cimg.DrawToHDC( hDC, &rect );ReleaseDC( pDC );}void CmymfcDlg::ResizeImage(IplImage* img){// 读取图片的宽和高int w = img->width;int h = img->height;// 找出宽和高中的较大值者int max = (w > h)? w: h;// 计算将图片缩放到TheImage区域所需的比例float scale = (float) ( (float) max / 256.0f );// 缩放后图片的宽和高int nw = (int)( w/scale );int nh = (int)( h/scale );// 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值int tlx = (nw > nh)? 0: (int)(256-nw)/2;int tly = (nw > nh)? (int)(256-nh)/2: 0;// 设置 TheImage 的 ROI 区域,用来存入图片 imgcvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) );// 对图片 img 进行缩放,并存入到 TheImage 中cvResize( img, TheImage );// 重置 TheImage 的 ROI 准备读入下一幅图片cvResetImageROI( TheImage );}void CmymfcDlg::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 ); // 调用显示图片函数cvReleaseImage( &gray );cvReleaseImage( &edge );}void CmymfcDlg::OnBnClickedRefresh() //恢复图片{// TODO: 在此添加控件通知处理程序代码//将读入的图片路径传给mPathCString mPath = rePath;// 读取图片、缓存到一个局部变量 ipl 中IplImage* ipl = cvLoadImage( mPath, 1 );// 判断是否成功读取图片if( !ipl )return;// 对上一幅显示的图片数据清零if( TheImage )cvZero( TheImage );// 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复制到 TheImage 中ResizeImage( ipl );// 调用显示图片函数ShowImage( TheImage,IDC_ShowImg);}void CmymfcDlg::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 );}void CmymfcDlg::OnBnClickedSobel() //用cvSobel函数的边缘检测{// 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 ); // 调用显示图片函数cvReleaseImage( &gray );cvReleaseImage( &edge );}void CmymfcDlg::OnBnClickedLaplace() //用cvLaplace函数实现图像的拉普拉斯变换{// 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 ); // 调用显示图片函数cvReleaseImage( &gray );cvReleaseImage( &edge );}void CmymfcDlg::fft2(IplImage* src, IplImage* des) //傅里叶正变换方法{//实部、虚部IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0;// int i, j;image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //实部//Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //虚部//2 channels (image_Re, image_Im)Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);// Real part conversion from u8 to 64f (double)cvConvertScale(src, image_Re, 1, 0);// Imaginary part (zeros)cvZero(image_Im);// Join real and imaginary parts and stock them in Fourier imagecvMerge(image_Re, image_Im, 0, 0, Fourier);// Application of the forward Fourier transformcvDFT(Fourier, des, CV_DXT_FORWARD);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);cvReleaseImage(&Fourier);}void CmymfcDlg::OnBnClickedFft2(){// TODO: 在此添加控件通知处理程序代码IplImage *src; //源图像IplImage *Fourier; //傅里叶系数IplImage *dst ;IplImage *ImageRe;IplImage *ImageIm;IplImage *Image;IplImage *ImageDst;double m,M;double scale;double shift;src = cvLoadImage(rePath,0); //加载源图像,第二个参数表示将输入的图片转为单信道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);//实现傅里叶逆变换,并对结果进行缩放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);}void CmymfcDlg::fft2shift(IplImage* src, IplImage* dst) //傅里叶变换{IplImage *image_Re = 0, *image_Im = 0;int nRow, nCol, i, j, cy, cx;double scale, shift, tmp13, tmp24;image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);//Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);cvSplit( src, image_Re, image_Im, 0, 0 );// Compute the magnitude of the spectrum Mag = 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 );//对数变换以增强灰度级细节(这种变换使以窄带低灰度输入图像值映射// Compute log(1 + Mag);cvAddS( image_Re, cvScalar(1.0), image_Re ); // 1 + MagcvLog( image_Re, image_Re ); // log(1 + Mag)//Rearrange the quadrants of Fourier image so that the origin is at the image centernRow = src->height;nCol = src->width;cy = nRow/2; // image centercx = 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)]*255double minVal = 0, maxVal = 0;// Localize minimum and maximum valuescvMinMaxLoc( image_Re, &minVal, &maxVal );// Normalize image (0 - 255) to be observed as an u8 imagescale = 255/(maxVal - minVal);shift = -minVal * scale;cvConvertScale(image_Re, dst, scale, shift);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);}void CmymfcDlg::OnBnClickedCimage() //图片的反转{// TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage//利用翻转函数cvFlip()将cImage反转cvFlip(cImage,NULL,0);ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);}void CmymfcDlg::OnBnClickedMirror() //图像的镜像{// TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage//利用翻转函数cvFlip()将cImage反转cvFlip(cImage,NULL,1);ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);}void CmymfcDlg::OnBnClickedCcolor() //图像的反色{// TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage//利用函数cvNot()将cImage每个像素点取反cvNot(TheImage,cImage);ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);}void CmymfcDlg::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); //这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_MEDIAN,5,5);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}void CmymfcDlg::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); //这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_GAUSSIAN,5,5);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}void CmymfcDlg::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(gray); //这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_BILATERAL,1,150,240,480);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}void CmymfcDlg::OnBnClickedEqually() //图片的均值滤波{// 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); //这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_BLUR,3,3);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}void CmymfcDlg::OnBnClickedCorrosion() //图片的腐蚀{// 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); //这里用克隆函数将sreImage图片复制给dstImagecvErode(gray,dstImage,0,1); //使用cvErode()函数实现图片的腐蚀ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}void CmymfcDlg::OnBnClickedDilate() //图片的膨胀{// 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); //这里用克隆函数将sreImage图片复制给dstImagecvDilate(gray,dstImage,0,1); //使用cvDilate()函数实现图片的膨胀ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);}-----精心整理,希望对您有所帮助!。

相关主题