📄 imageview.cpp
字号:
// ImageView.cpp : implementation of the CImageView class
//
#include "stdafx.h"
#include "Image.h"
#include "ImageDoc.h"
#include "ImageView.h"
/////////begin/////////////////////////////////
#include "cv.h" // include core library interface
#include "highgui.h" // include GUI library interface
#pragma comment(lib, "cv" )
#pragma comment(lib, "highgui" )
#pragma comment(lib, "cxcore" )
CString imgfilepath;
IplImage* img=0; // Declare IPL/OpenCV image pointer
////////end/////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageView
IMPLEMENT_DYNCREATE(CImageView, CView)
BEGIN_MESSAGE_MAP(CImageView, CView)
//{{AFX_MSG_MAP(CImageView)
ON_COMMAND(ID_IMAGE_OPENFILE, OnImageOpenFile)
ON_COMMAND(ID_IMAGE_SOBEL, OnImageSobel)
ON_COMMAND(ID_IMAGE_LAPLACE, OnImageLaplace)
ON_COMMAND(ID_IMAGE_CANNY, OnImageCanny)
ON_COMMAND(ID_IMAGE_HISTGRAM, OnImageHistgram)
ON_COMMAND(ID_IMAGE_RESIZE, OnImageResize)
ON_COMMAND(ID_IMAGE_ROTATION, OnImageRotation)
ON_COMMAND(ID_IMAGE_EROSION, OnImageErosion)
ON_COMMAND(ID_IMAGE_OPEN, OnImageOpen)
ON_COMMAND(ID_IMAGE_HOUGH_LINE, OnImageHoughLine)
ON_COMMAND(ID_IMAGE_HOUGH_CIRCLE, OnImageHoughCircle)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction
CImageView::CImageView()
{
// TODO: add construction code here
}
CImageView::~CImageView()
{
}
BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageView drawing
void CImageView::OnDraw(CDC* pDC)
{
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CImageView printing
BOOL CImageView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CImageView diagnostics
#ifdef _DEBUG
void CImageView::AssertValid() const
{
CView::AssertValid();
}
void CImageView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageDoc* CImageView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
return (CImageDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageView message handlers
void CImageView::OnImageOpenFile()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE, _T("*.bmp"), "",
OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
"image files (*.bmp; *.jpg) |*.bmp;*.jpg|AVI files (*.avi) |*.avi|All Files (*.*)|*.*||",NULL);
char title[]= {"Open Image"};
dlg.m_ofn.lpstrTitle= title;
if (dlg.DoModal() == IDOK)
{
imgfilepath= dlg.GetPathName();
if (img!=0)
cvReleaseImage( &img );
img = cvvLoadImage( imgfilepath ); // load image
cvvNamedWindow( "Original Image", 1 ); // create a window
cvvShowImage( "Original Image", img ); // display the image on window
}
}
void CImageView::OnImageSobel()
{
// TODO: Add your command handler code here
//定义的变量
IplImage* pImage= NULL; // 声明IplImage 变量
IplImage* pImgSobelgray= NULL;// 声明IplImage 变量,用于灰度图像Sobel变换
IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
IplImage* pImgColor= NULL;// 声明IplImage 变量,用于Sobel变换
IplImage* pImgSobelcolor= NULL;// 声明IplImage 变量,用于彩色图像Sobel变换
IplImage* pImgPlanes[3] = { 0, 0, 0 };
//将已读入系统的图像复制一份
pImage=cvCloneImage( img );
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
//即无符号8位整型
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
//对灰度图像进行Sobel变换
//将彩色图像转换为灰度图像
cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
//对图像进行高斯滤波
cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型
//因为cvSobel函数要求目标图像必须是16-bit图像
pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S, 1);
//计算一阶 x方向的图像差分,可根据需要设置参数
cvSobel(pImg8uSmooth, pImgSobelgray,0,1,3);
//将图像格式再转换回来,用于显示
cvConvertScaleAbs(pImgSobelgray,pImg8u,1,0 ) ;
//创建窗口,显示图像
cvvNamedWindow( "Sobel gray Image", 1 );
cvvShowImage( "Sobel gray Image", pImg8u );
//对彩色图像进行Sobel变换
//建立3个图像内存区,分别存储图像3个通道,图像元素的位深度设为IPL_DEPTH_8U
int i;
for( i = 0; i < 3; i++ )
pImgPlanes[i] = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 1 );
//建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型
pImgSobelcolor = cvCreateImage( cvSize(pImage ->width, pImage ->height), IPL_DEPTH_16S, 1 );
//要求输出图像是 16 位有符号的
pImgColor = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 3 );
//将彩色图像分成3 个单通道图像
cvCvtPixToPlane(pImage, pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0 );
for( i = 0; i < 3; i++ )
{
//分别对每通道图像进行Sobel变换
cvSobel( pImgPlanes[i], pImgSobelcolor,0,1,3 );
//转化为8位的图像
cvConvertScaleAbs(pImgSobelcolor, pImgPlanes[i], 1, 0 );
}
//将各通道图像进行合并
cvCvtPlaneToPix( pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0, pImgColor);
//创建窗口,显示图像
cvvNamedWindow( "Sobel color Image", 1 );
cvvShowImage( "Sobel color Image", pImgColor);
//等待按键
cvWaitKey(0);
//锁毁窗口
cvDestroyWindow( " Sobel gray Image " );
cvDestroyWindow( " Sobel color Image " );
//将程序开始定义的变量释放
cvReleaseImage( & pImage);
cvReleaseImage( & pImgSobelgray);
cvReleaseImage( & pImgSobelcolor);
cvReleaseImage( & pImg8u);
cvReleaseImage( & pImg8uSmooth);
}
void CImageView::OnImageLaplace()
{
// TODO: Add your command handler code here
//定义的变量
IplImage* pImage= NULL;// 声明IplImage 变量
IplImage* pImgLaplace= NULL;// 声明IplImage 变量,用于Laplace变换
IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
//将已读入系统的图像复制一份
pImage=cvCloneImage( img );
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
//即无符号8位整型
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
pImg8uSmooth= cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
//将彩色图像转换为灰度图像
cvCvtColor(pImage,pImg8u, CV_BGR2GRAY);
//对灰度图像进行高斯滤波
cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//此函数和cvSobel函数一样要求目标图像必须是16-bit图像
//如果给8-bit目标图像会报错
pImgLaplace = cvCreateImage(cvGetSize(img),IPL_DEPTH_16S, 1);
cvLaplace(pImg8uSmooth, pImgLaplace,3);
//将图像格式再转换回来,用于显示
cvConvertScaleAbs(pImgLaplace,pImg8u,1,0 ) ;
//创建窗口,显示图像
cvvNamedWindow( "laplace gray Image", 1 );
cvvShowImage( "laplace gray Image", pImg8u );
//等待按键
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( " laplace gray Image " );
//将程序开始定义的变量释放
cvReleaseImage( & pImage);
cvReleaseImage( & pImgLaplace);
cvReleaseImage( & pImg8u);
//cvReleaseImage( & pImg8uSmooth);
}
void CImageView::OnImageCanny()
{
// TODO: Add your command handler code here
IplImage* pImage= NULL;// 声明IplImage 变量
IplImage* pImgCanny= NULL;// 声明IplImage 变量,用于灰度图像Canny变换
IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像
//将已读入系统的图像复制一份
pImage=cvCloneImage( img );
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
//即无符号8位整型
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
//对灰度图像进行Canny变换
//将彩色图像转换为灰度图像
cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
//对图像进行高斯滤波
cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//cvCanny的源图像必须是灰度图像
cvCanny(pImg8uSmooth,pImgCanny, 100, 200, 3 );
//将图像格式再转换回来,用于显示
cvConvertScaleAbs(pImgCanny,pImg8u,1,0 ) ;
//创建窗口,显示图像
cvvNamedWindow( "Canny Image", 1 );
cvvShowImage( "Canny Image", pImg8u);
//等待按键
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( " Canny Image " );
//将程序开始定义的变量释放
cvReleaseImage( & pImage);
cvReleaseImage( & pImgCanny);
cvReleaseImage( & pImg8u);
cvReleaseImage( & pImg8uSmooth);
}
void CImageView::OnImageHistgram()
{
// TODO: Add your command handler code here
int hist_size = 255; //直方图的针数
float range_0[]={0,256}; //第0维数值的变化范围
float* ranges[] = { range_0 };//第1维数值的变化范围
int i, bin_w; //下标号
float max_value = 0, min_value = 0; //直方图数值的max和min
int min_idx = 0, max_idx = 0; //对应上述max和min数值时的下标号
double mean = 0, variance = 0; //用于存放平均值(mean)和变化量(variance)的变量
IplImage* pImage= NULL;// 声明IplImage 变量
IplImage* pImgGray= NULL;// 声明IplImage 变量
//将已读入系统的图像一份
pImage=cvCloneImage( img );
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
pImgGray = cvCreateImage(cvSize(pImage->width,pImage->height),
IPL_DEPTH_8U, 1);
//转换成灰度图像
cvCvtColor(pImage, pImgGray, CV_BGR2GRAY);
//创建一个矩形区域
CvRect rect = cvRect(0, 0, 500, 600 );
//把矩形作用于图像以建立一个感兴趣区(region of interest, ROI)
cvSetImageROI(pImgGray, rect); // 设置 ROI
//创建一个图像用来存放直方图
IplImage* histImage = cvCreateImage(cvSize(320,200), 8, 1);
//创建一个指定尺寸的直方图,用于存放从图像获得的信息
CvHistogram* hist =
cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
//计算直方图并作用到hist变量
cvCalcHist( &pImgGray, hist, 0, NULL );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -