您的位置:首页 > 运维架构

《学习OpenCV》练习6-5

2014-02-15 20:21 357 查看
#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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c opencv 图像处理 图形