图像处理opencv代码.docx
- 文档编号:5939495
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:20
- 大小:20.38KB
图像处理opencv代码.docx
《图像处理opencv代码.docx》由会员分享,可在线阅读,更多相关《图像处理opencv代码.docx(20页珍藏版)》请在冰豆网上搜索。
图像处理opencv代码
#include"stdafx.h"
#include"mymfc.h"
#include"mymfcDlg.h"
#include"afxdialogex.h"
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialogEx
{
public:
CAboutDlg();
//对话框数据
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
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();
//将“关于...”菜单项添加到系统菜单中。
CvSizeImgSize;
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)
{
BOOLbNameValid;
CStringstrAboutMenu;
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:
在此添加额外的初始化代码
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
//使图标在工作区矩形中居中
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窗口,如果无这步调用,图片显示还会出现问题
//ShowImage(TheImage,IDC_ShowImg);
//重绘图片函数
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCmymfcDlg:
:
OnQueryDragIcon()
{
returnstatic_cast
}
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);
//将图片绘制到显示控件的指定区域内
cimg.DrawToHDC(hDC,&rect);
ReleaseDC(pDC);
}
voidCmymfcDlg:
:
ResizeImage(IplImage*img)
{
//读取图片的宽和高
intw=img->width;
inth=img->height;
//找出宽和高中的较大值者
intmax=(w>h)?
w:
h;
//计算将图片缩放到TheImage区域所需的比例
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区域,用来存入图片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);//调用显示图片函数
cvReleaseImage(&gray);
cvReleaseImage(&edge);
}
voidCmymfcDlg:
:
OnBnClickedRefresh()//恢复图片
{
//TODO:
在此添加控件通知处理程序代码
//将读入的图片路径传给mPath
CStringmPath=rePath;
//读取图片、缓存到一个局部变量ipl中
IplImage*ipl=cvLoadImage(mPath,1);
//判断是否成功读取图片
if(!
ipl)
return;
//对上一幅显示的图片数据清零
if(TheImage)
cvZero(TheImage);
//对读入的图片进行缩放,使其宽或高最大值者刚好等于256,再复制到TheImage中
ResizeImage(ipl);
//调用显示图片函数
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函数的边缘检测
{
//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);
}
voidCmymfcDlg:
:
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);
}
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;//傅里叶系数
IplImage*dst;
IplImage*ImageRe;
IplImage*ImageIm;
IplImage*Image;
IplImage*ImageDst;
doublem,M;
doublescale;
doubleshift;
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);
cvP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 处理 opencv 代码