【练习6.5】cvSobel及参数要求、cvCartToPolar坐标空间映射、cvMinMaxLoc求自大最小值、cvAvg求平均值
2015-05-01 11:20
330 查看
题目要求 |
程序代码 |
结果图片 |
要言妙道 |
创建一副图像,其中只有45度直线,背景为黑色,直线为白色,使用一系列中孔尺寸,得到图像一阶x方向导数核一阶y方向导数,组成图像的输入梯度。使用与cvCartToPolar函数对应的公式测量
优秀代码参考:
#include <iostream> #include <cv.h> #include <highgui.h> #include <cxcore.h> using namespace std; const CvSize size = cvSize(200,200); const int aperture[] = {3,5,9,11,13,17}; int main() { IplImage *src = cvCreateImage(size,8,1); cvZero(src); cvLine(src //,cvPoint(0,size.height - 1) //,cvPoint(size.width -1 , 0) ,cvPoint(0,0) ,cvPoint(size.width - 1, size.height - 1) ,CV_RGB(255,255,255) ,3 ); cvShowImage("src",src); IplImage *deriv_x = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage *deriv_y = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage *magnitude = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage *angle = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage *mask = cvCreateImage(size,IPL_DEPTH_8U,1); for(int i=0;i<sizeof(aperture)/sizeof(aperture[0]);++i){ cvSobel(src,deriv_x,1,0,aperture[i]); cvSobel(src,deriv_y,0,1,aperture[i]); 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); cvMinMaxLoc(angle,&min_angle,&max_angle); cout<<"magnitude: max = "<<max_mag<<" min = "<<min_mag<<endl; cout<<"angle : max = "<<max_angle<<" min = "<<min_angle<<endl; cvCmpS(magnitude,max_mag*3/4,mask,CV_CMP_GT); cvShowImage("mask",mask); CvScalar scalar = cvAvg(angle,mask); cout<<"aperture = "<<aperture[i]<<", line angle = "<<scalar.val[0]<<endl; cvWaitKey(); } cvReleaseImage(&src); cvReleaseImage(&magnitude); cvReleaseImage(&angle); cvReleaseImage(&mask); cvDestroyAllWindows(); }
View Code
源自:学习opencv第六章习题5 , 使用x,y阶层数求出图像内唯一直线的角度
程序代码:
// OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。 // //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <iostream> #include <opencv2/legacy/legacy.hpp> //#pragma comment(lib, "opencv_legacy2411.lib") using namespace cv; using namespace std; //函数声明-->--->-->--->-->--->-->--->// //<--<--<--<--<--<--<--<--<--函数声明// int _tmain(int argc, _TCHAR* argv[]) { const CvSize size = cvSize(400, 400); const int aperture[] = { 1, 3, 5, 7 }; cvNamedWindow("原始图像", CV_WINDOW_AUTOSIZE); IplImage * image_Gray = cvCreateImage(size, IPL_DEPTH_8U, 1); cvZero(image_Gray); //画5度直线 cvLine(image_Gray, cvPoint(0, 0), cvPoint(size.width, size.height), cvScalar(255), 3); cvShowImage("原始图像", image_Gray); IplImage *deriv_x = cvCreateImage(size, IPL_DEPTH_32F, 1); IplImage *deriv_y = cvCreateImage(size, IPL_DEPTH_32F, 1); IplImage *magnitude = cvCreateImage(size, IPL_DEPTH_32F, 1); IplImage *angle = cvCreateImage(size, IPL_DEPTH_32F, 1); IplImage *mask = cvCreateImage(size, IPL_DEPTH_8U, 1); //求导 int filtersNum = sizeof(aperture) / sizeof(aperture[0]); for (int i = 0; i<filtersNum; ++i) { cvSobel(image_Gray, deriv_x, 1, 0, aperture[i]); cvSobel(image_Gray, deriv_y, 0, 1, aperture[i]); 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); cvMinMaxLoc(angle, &min_angle, &max_angle); cout << "magnitude: max = " << max_mag << " min = " << min_mag << endl; cout << "angle : max = " << max_angle << " min = " << min_angle << endl; cvCmpS(magnitude, max_mag * 3 / 4, mask, CV_CMP_GT); //窗口名称及显示 char *pre_mask = "ApertureFilter_mask:"; char *aperature_size = new char(1); _itoa_s(aperture[i], aperature_size, 2, 10); int name_size = strlen(pre_mask) + strlen(aperature_size) + 1; char * windowName_mask = new char(name_size); strcpy_s(windowName_mask, name_size, pre_mask); strcat_s(windowName_mask, name_size, aperature_size); cvShowImage(windowName_mask, mask); CvScalar scalar = cvAvg(angle, mask); cout << "aperture = " << aperture[i] << ", line angle = " << scalar.val[0] << endl; } cvWaitKey(); cvReleaseImage(&image_Gray); cvReleaseImage(&magnitude); cvReleaseImage(&angle); cvReleaseImage(&mask); cvDestroyAllWindows(); return 0; }
结果图片:
要言妙道:
①cvSobel支持(aperture_size = 1,3,5,7) or Scharr (aperture_size = -1) operator,所以,没有安装题目中要求使用9×9滤波器完成
②可以使用cvShowImage显示deriv_x等所有图像,但必须使用cvConvertScale 或 cvConvertScaleAbs转换为8为才能看到正确的图像,代码中使用cvSave保存到了文件中,更容易观察
③cvCartToPolar函数正是使用了题目中的公式来计算magnitude及 angle,相见OpenCV参考
④cvSobel执行时,如果输入图像为8位,输出图像必须≥IPL_DEPTH_16S,《学习OpenCV》中文英版说图像深度必须是IPL_DEPTH_16S应该不准确
相关文章推荐
- 第六章堆排序之“用最小堆将k个已排序链表合并为一个排序链表”(练习6.5-8)
- 建立一个类ARRAY,求一维数组中各元素的最大值、最小值和平均值。具体要求如下:
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 第六章堆排序之“用最小堆将k个已排序链表合并为一个排序链表”(练习6.5-8)
- [每日练习]Amazon面试题:数组有N-2个数字,数字的范围为1 ... N,没有重复的元素,要求打印缺少的2个数字,不可以用额外的空间
- 字符串移动(字符串为’*’号和26个字母的任意组合, 把’*’号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 编写一个求n个数的平均值及最小值的程序。要求:程序执行时,用户先由键盘输入n的值,之后输入n个数,最后,程序显示平均值和最小值。
- 坐标空间和映射模式
- 解决:“由于最小日志空间要求,无法收缩日志文件”
- shell 从输入的参数里找出最大值,最小值,平均值
- MFC中坐标空间与映射
- OpenCV 颜色空间转换参数CV_BGR2GRAY改变
- [每日练习]数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间
- 《算法导论》练习6.5-8—最小堆k路合并
- C#小练习(输入10个数存入数组中,求最大值、最小值和平均值.)
- MFC中坐标空间 与 映射
- opencv中cvCalibrateCamera2的参数npoints对数据类型的要求
- hdu 2295 Radar 重复覆盖 DLX+二分答案 给出一些城市及一些雷达的坐标,要求从这些雷达中选取最多k个能够覆盖所有的城市,问雷达的最小覆盖半径为多少
- MFC坐标空间与映射模式
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小