图像处理opencv代码

图像处理opencv代码
图像处理opencv代码

#include "stdafx.h"

#include "mymfc.h"

#include "mymfcDlg.h"

#include "afxdialogex.h"

#include

#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(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(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号

{

// 获得显示控件的 DC

CDC* 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 区域,用来存入图片 img

cvSetImageROI( 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: 在此添加控件通知处理程序代码

//将读入的图片路径传给mPath

CString 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 part

image_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 image

cvMerge(image_Re, image_Im, 0, 0, Fourier);

// Application of the forward Fourier transform

cvDFT(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);

相关主题
相关文档
最新文档