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

📄 imageview.cpp

📁 基于OpenCV的计算机视觉技术实现.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	//得到直方图中的最大最小值及其标号
	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 + -