《学习OpenCV》练习6-5

#include "cv.h"
#include "highgui.h"
#include "stdio.h"

/*设置图像尺寸*/
const CvSize size = cvSize(400,400);
/*cvSobel()函数的参数,为方形滤波器的宽或高,可以为1,3,5,7,9...*/
const int aperture[] = { 3, 5, 9, 11, 13, 17 };								

int main()
{
	IplImage* img_sorce = cvCreateImage( size, 8, 1 );						//以size为尺寸、创建一数据深度为8位、单通道图像
	cvZero(img_sorce);														//清零
	cvLine( img_sorce,														//在图像左上角到右下角画一对角线,颜色为白色
		    cvPoint(0,0), 
			cvPoint(size.width - 1, size.height - 1), 
			CV_RGB(255,255,255), 
			3 );
	cvNamedWindow( "img_sorce", CV_WINDOW_AUTOSIZE );						//生成窗口
	cvNamedWindow( "deriv_x", CV_WINDOW_AUTOSIZE );						
	cvNamedWindow( "deriv_y", CV_WINDOW_AUTOSIZE );
	cvNamedWindow( "magnitude", CV_WINDOW_AUTOSIZE );
	cvNamedWindow( "angle", CV_WINDOW_AUTOSIZE );
	cvNamedWindow( "img_dst", CV_WINDOW_AUTOSIZE );

	cvShowImage( "img_sorce", img_sorce );									//显示源图像
	
	IplImage* deriv_x = cvCreateImage( size, IPL_DEPTH_32F, 1 );			//x方向求导的图像	
	IplImage* deriv_y = cvCreateImage( size, IPL_DEPTH_32F, 1 );			//y方向求导
	IplImage* magnitude = cvCreateImage( size, IPL_DEPTH_32F, 1 );			//极坐标的极径
	IplImage* angle = cvCreateImage( size, IPL_DEPTH_32F, 1 );				//极坐标的极角
	IplImage* img_dst = cvCreateImage( size, IPL_DEPTH_8U, 1 );

	/*for循环,当i小于数组的总长度除以数组第一项的长度(即数组变量个数)时进入循环*/
	for (int i=0; i<sizeof(aperture)/sizeof(aperture[0]); ++i)
	{
		cvSobel( img_sorce, deriv_x, 1, 0, aperture[i] );					//生成x方向求导图像
		cvSobel( img_sorce, deriv_y, 0, 1, aperture[i] );					//生成y方向求导图像

		cvCartToPolar( deriv_x, deriv_y, magnitude, angle, 1 );				//笛卡尔直角坐标系转换至极坐标系

		cvSave( "x.xml", deriv_x );											//保存
		cvSave( "y.xml", deriv_y );
		cvSave( "magnitude.xml", magnitude );
		cvSave( "angle.xml", angle );

		double max_mag, min_mag, max_angle, min_angle;						//最大最小极径、极角
		cvMinMaxLoc( magnitude, &min_mag, &max_mag );						//将magnitude中的最大值赋给min_mag,最小值赋给max_mag
		cvMinMaxLoc( angle, &min_angle, &max_angle );						//将angle中的最大值赋给min_angle,最小值赋给max_angle

		printf( "magnitude: max = %f\nmin = %f\n", max_mag, min_mag );		//显示
		printf( "angle: max = %f\nmin = %f\n", max_angle, min_angle );
		
		/*如果magnitude中的某像素值大于其最大值的四分之三,则将赋给img_dst*/
		cvCmpS( magnitude, max_mag*3/4, img_dst, CV_CMP_GT );		

		cvShowImage( "deriv_x", deriv_x );									//显示图片
		cvShowImage( "deriv_y", deriv_y );
		cvShowImage( "magnitude", magnitude );
		cvShowImage( "angle", angle );
		cvShowImage( "img_dst", img_dst );

		/*计算angle中img_dst中非空像素的平均值*/
		CvScalar scalar = cvAvg( angle, img_dst );							
		printf( "aperture = %d\nline angle = %d\n\n", aperture[i], scalar.val[0] );
		cvWaitKey(0);
	}
	cvReleaseImage( &img_sorce );
	cvReleaseImage( &magnitude );
	cvReleaseImage( &angle );
	cvReleaseImage( &img_dst );
	cvDestroyAllWindows();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值