📄 imageview.cpp
字号:
//得到直方图中的最大最小值及其标号
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -