《学习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; }
相关文章推荐
- 《学习OpenCV(中文版)》第4章 练习3a
- 《学习OpenCV》练习4-3
- 《学习OpenCV(中文版)》第4章 练习3b
- 《学习OpenCV》练习4-4
- 《学习OpenCV (中文版)》第2章 练习3和练习4
- 《学习OpenCV(中文版)》第4章 练习4
- 基于QT5的opencv学习之《学习opencv课后练习3-7》
- 《学习OpenCV》练习5-1
- 《学习OpenCV(中文版)》第4章 练习5a
- 《学习OpenCV》练习5-2
- 《学习OpenCV》练习5-4
- 《学习OpenCV》第四章练习答案1-b,1-c,2-a
- 《学习OpenCV》练习5-5
- 《学习OpenCV(中文版)》第4章 练习2
- 《学习OpenCV》练习5-11
- 《学习OpenCV》例2-3课后练习(page24)
- 《学习OpenCV》练习2-5
- 《学习OpenCV》练习6-2
- 《学习OpenCV》练习3-2
- 《学习OpenCV》练习6-7