⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageview.cpp

📁 基于OpenCV的计算机视觉技术实现.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -