-
// 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 );
-
-
//得到直方图中的最大最小值及其标号
-
cvGetMinMaxHistValue( hist, &min_value, &max_value, &min_idx, &max_idx);
-
//缩放这些针值以容入图像内
-
cvScale( hist->bins, hist->bins, ((double)histImage->height)/max_value, 0 );
-
-
//设所有直方图的数值为255
-
cvSet( histImage, cvScalarAll(255), 0 );
-
//建立一个比例因子以沿宽度缩放
-
bin_w = cvRound((double)histImage->width/hist_size);
-
for( i = 0; i < hist_size; i++ ) {
-
//把直方图画到图像中
-
cvRectangle( histImage, cvPoint(i*bin_w, histImage->height),
-
cvPoint((i+1)*bin_w,
-
histImage->height - cvRound(cvGetReal1D(hist->bins,i))),
-
cvScalarAll(0), -1, 8, 0 );
-
-
//得到当前数值
-
float* bins = cvGetHistValue_1D(hist,i);
-
//增加均值
-
mean += bins[0];
-
// std::cout<< bins[0] << " " << bins[1] << std::endl;
-
}
-
//均值计算完毕
-
mean /= hist_size;
-
-
//有了均值后就可以计算变化量了(variance)
-
for( i = 0; i < hist_size; i++ ) {
-
float* bins = cvGetHistValue_1D(hist,i);
-
variance += pow((bins[0] - mean),2);
-
}
-
-
//变化量计算完毕
-
variance /= hist_size;
-
-
// std::cout << "Histogram Mean: " << mean << std::endl;
-
// std::cout << "Variance: " << variance << std::endl;
-
// std::cout << "Standard Deviation: " << sqrt(variance) << std::endl;
-
-
//创建窗口,显示图像
-
cvNamedWindow("Original", 0);
-
cvShowImage("Original", pImage );
-
-
cvNamedWindow("Gray", 0);
-
cvShowImage("Gray", pImgGray );
-
-
cvNamedWindow("Histogram", 0);
-
cvShowImage("Histogram", histImage );
-
-
-
CvFont *pfont=new CvFont;
-
cvInitFont(pfont,CV_FONT_HERSHEY_SIMPLEX ,0.8f,0.8f,0,2);
-
CString Result="Histogram Mean: ";
-
CString str; str.Format("%f", mean);
-
Result+=str+"\n";
-
-
cvPutText(histImage,Result,cvPoint(80,80),pfont,CV_RGB(255,0,0));
-
delete pfont;
-
-
//等待按键
-
cvWaitKey(0);
-
-
//将程序开始定义的变量释放
-
cvReleaseImage(&histImage);
-
cvReleaseImage(&pImgGray);
-
-
//销毁窗口
-
cvDestroyWindow("Original");
-
cvDestroyWindow("Gray");
-
cvDestroyWindow("Histogram");
-
-
-
}
-
-
void CImageView::OnImageResize()
-
{
-
// TODO: Add your command handler code here
-
IplImage* pImage= NULL;// 声明IplImage 变量
-
IplImage* pImgNew= NULL;// 声明IplImage 变量
-
-
-
//将已读入系统的图像复制一份
-
pImage=cvCloneImage( img );
-
-
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 again"};
-
dlg.m_ofn.lpstrTitle= title;
-
-
if (dlg.DoModal() == IDOK)
-
{
-
imgfilepath= dlg.GetPathName();
-
if (pImgNew!=0)
-
cvReleaseImage( &pImgNew );
-
//载入第二幅图像
-
pImgNew = cvvLoadImage( imgfilepath );
-
-
//创建窗口,显示第二幅图像
-
cvvNamedWindow( "Second Image", 1 );
-
cvvShowImage( "Second Image", pImgNew );
-
}
-
-
//缩放图像,使其尺寸与第二幅图像相等
-
cvResize( pImage, pImgNew, CV_INTER_NN );
-
-
//创建窗口,显示缩放后的幅图像
-
cvvNamedWindow( "Resized Image", 1 );
-
cvvShowImage( "Resized Image", pImgNew );
-
-
//等待按键
-
cvWaitKey(0);
-
-
//将程序开始定义的变量释放
-
cvReleaseImage(&pImage);
-
cvReleaseImage(&pImgNew);
-
-
//销毁窗口
-
cvDestroyWindow("Second Image");
-
cvDestroyWindow("Resized Image");
-
-
}
-
-
void CImageView::OnImageRotation()
-
{
-
// TODO: Add your command handler code here
-
int angle = 30; //旋转30度
-
int opt = 0; // 1: 加缩放
-
// 0: 仅仅旋转
-
double factor; //缩放因子
-
IplImage* pImage= NULL;// 声明IplImage 变量
-
IplImage* pImgRotation= NULL;// 声明IplImage 变量
-
-
-
//将已读入系统的图像复制一份
-
pImage=cvCloneImage( img );
-
pImgRotation=cvCloneImage( img );
-
-
//创建M矩阵
-
float m[6];
-
// Matrix m looks like:
-
//
-
// [ m0 m1 m2 ] ===> [ A11 A12 b1 ]
-
// [ m3 m4 m5 ] [ A21 A22 b2 ]
-
//
-
CvMat M = cvMat( 2, 3, CV_32F, m );
-
int w = img->width;
-
int h = img->height;
-
if(opt) // 旋转加缩放
-
factor = (cos(angle*CV_PI/180.) + 1.0)*2;
-
else // 仅仅旋转
-
factor = 1;
-
m[0] = (float)(factor*cos(-angle*CV_PI/180.));
-
m[1] = (float)(factor*sin(-angle*CV_PI/180.));
-
m[3] = -m[1];
-
m[4] = m[0];
-
// 将旋转中心移至图像中间
-
m[2] = w*0.5f;
-
m[5] = h*0.5f;
-
-
// dst(x,y) = A * src(x,y) + b
-
cvZero(pImgRotation);
-
cvGetQuadrangleSubPix( pImage, pImgRotation, &M);
-
-
//创建窗口,显示图像
-
cvNamedWindow( "Rotation Image", 1 );
-
cvShowImage( "Rotation Image", pImgRotation );
-
-
//等待按键
-
cvWaitKey(0);
-
-
//将程序开始定义的变量释放
-
cvReleaseImage(&pImage);
-
cvReleaseImage(&pImgRotation);
-
-
//销毁窗口
-
cvDestroyWindow("Rotation Image");
-
-
}
-
-
void CImageView::OnImageErosion()
-
{
-
// TODO: Add your command handler code here
-
IplImage* pImgErode= NULL;// 声明IplImage 变量
-
IplImage* pImgDilate= NULL;// 声明IplImage 变量
-
-
//将已读入系统的图像复制一份
-
pImgErode=cvCloneImage( img );
-
pImgDilate=cvCloneImage( img );
-
-
-
//对输入图像使用默认的3×3 长方形结构元素进行腐蚀
-
cvErode( pImgErode, pImgErode, 0, 2 );
-
-
//对输入图像使用默认的3×3 长方形结构元素进行膨胀
-
cvDilate( pImgDilate, pImgDilate, 0, 2 );
-
-
-
//创建窗口,显示图像
-
cvNamedWindow("Erosion", 0);
-
cvShowImage("Erosion", pImgErode );
-
-
cvNamedWindow("Dilation", 0);
-
cvShowImage("Dilation", pImgDilate );
-
-
//等待按键
-
cvWaitKey(0);
-
-
//将程序开始定义的变量释放
-
cvReleaseImage(&pImgErode);
-
cvReleaseImage(&pImgDilate);
-
-
//销毁窗口
-
cvDestroyWindow("Erosion");
-
cvDestroyWindow("Dilation");
-
-
-
}
-
-
void CImageView::OnImageOpen()
-
{
-
// TODO: Add your command handler code here
-
IplImage* pImgOpen= NULL;// 声明IplImage 变量
-
IplImage* pImgClose= NULL;// 声明IplImage 变量
-
IplConvKernel* pKernel =NULL;// 声明IplConvKernel 变量
-
-
//将已读入系统的图像复制一份
-
pImgOpen=cvCloneImage( img );
-
pImgClose=cvCloneImage( img );
-
-
-
//创建立结构元素
-
pKernel = cvCreateStructuringElementEx(15,15,8,8,CV_SHAPE_ELLIPSE,NULL);
-
-
//进行开运算
-
cvErode(pImgOpen,pImgOpen,pKernel,1);
-
cvDilate(pImgOpen,pImgOpen,pKernel,1);
-
-
-
//进行闭运算
-
cvDilate(pImgClose,pImgClose,pKernel,1);
-
cvErode(pImgClose,pImgClose,pKernel,1);
-
-
-
//创建窗口,显示图像
-
cvNamedWindow("Open", 0);
-
cvShowImage("Open", pImgOpen );
-
-
cvNamedWindow("Close", 0);
-
cvShowImage("Close", pImgClose );
-
-
-
//等待按键
-
cvWaitKey(0);
-
-
//将程序开始定义的变量释放
-
cvReleaseImage(&pImgOpen);
-
cvReleaseImage(&pImgClose);
-
-
//销毁窗口
-
cvDestroyWindow("Open");
-
cvDestroyWindow("Close");
-
-
-
}
-
-
void CImageView::OnImageHoughLine()
-
{
-
// TODO: Add your command handler code here
-
IplImage* pImage= NULL;// 声明IplImage 变量
-
IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
-
IplImage* pImgCanny= NULL;// 声明IplImage 变量,用于灰度图像Canny变换
-
CvMemStorage* storage = NULL;// 声明storage 变量,用于存储检测到的线段
-
CvSeq* lines = NULL; //声明lines变量,用于存储直线的轮廓
-
-
//将已读入系统的图像复制两份,一份作为背景图像
-
pImage=cvCloneImage( img );
-
-
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
-
//即无符号8位整型
-
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
-
pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
-
-
//将彩色图像转换为灰度图像
-
cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
-
-
//创建内存空间
-
storage = cvCreateMemStorage(0);
-
-
//利用Canny变换找出图像边缘
-
cvCanny( pImg8u, pImgCanny, 50, 500, 3 );
-
//Hough线变换
-
lines = cvHoughLines2( pImgCanny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
-
-
//在原图上画红直线
-
int i;
-
for( i = 0; i < lines->total; i++ )
-
{
-
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
-
cvLine( pImage, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
-
}
-
-
-
//创建窗口,显示图像
-
cvNamedWindow( "Hough Line Transform", 1 );
-
cvShowImage( "Hough Line Transform", pImage);
-
-
-
//等待按键
-
cvWaitKey(0);
-
-
//销毁窗口
-
cvDestroyWindow( " Hough Line Transform " );
-
-
//将程序开始定义的变量释放
-
cvReleaseImage( & pImage);
-
cvReleaseImage( & pImgCanny);
-
cvReleaseImage( & pImg8u);
-
-
-
}
-
-
void CImageView::OnImageHoughCircle()
-
{
-
// TODO: Add your command handler code here
-
IplImage* pImage= NULL;// 声明IplImage 变量
-
IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换
-
CvMemStorage* storage = NULL;// 声明storage 变量,用于存储检测到的线段
-
CvSeq* circles = NULL;
-
-
-
//将已读入系统的图像一份
-
pImage=cvCloneImage( img );
-
-
//建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U
-
//即无符号8位整型
-
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
-
-
-
//转换成灰度图像
-
if(img->nChannels != 1)
-
cvCvtColor( pImage, pImg8u, CV_BGR2GRAY );
-
else
-
cvCopy(pImage, pImg8u);
-
//平滑化
-
cvSmooth( pImg8u, pImg8u, CV_GAUSSIAN, 7, 7 );
-
-
//创建内存空间
-
storage = cvCreateMemStorage(0);
-
-
//Hough圆变换
-
circles = cvHoughCircles( pImg8u, storage, CV_HOUGH_GRADIENT, 2, pImg8u->height/4, 250, 55 );
-
-
// 画出识别出的圆
-
int i;
-
for( i = 0; i < circles->total; i++ )
-
{
-
float* p = (float*)cvGetSeqElem( circles, i );
-
cvCircle(pImage, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
-
}
-
-
//创建窗口,显示图像
-
cvNamedWindow( "Hough Circle Transform", 1 );
-
cvShowImage( "Hough Circle Transform", pImage);
-
-
-
//等待按键
-
cvWaitKey(0);
-
-
//销毁窗口
-
cvDestroyWindow( " Hough Circle Transform " );
-
-
//将程序开始定义的变量释放
-
cvReleaseImage( & pImage);
-
cvReleaseImage( & pImg8u);
-
-
-
}