预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

特殊图像变换 1、 HoughLines 功能:利用Hough变换在二值图像中找到直线 格式:CvSeq*cvHoughLines2(CvArr*image,void*line_storage,intmethod, doublerho,doubletheta,intthreshold, doubleparam1=0,doubleparam2=0); 参数:image:输入8-比特、单通道(二值)图像,其内容可能被函数所改变 line_storage:检测到的线段存储仓.可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的cols/rows将包含一组检测到的线段。如果line_storage是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序). method:Hough变换变量,是下面变量的其中之一: CV_HOUGH_STANDARD-传统或标准Hough变换.每一个线段由两个浮点数(ρ,θ)表示,其中ρ是点与原点(0,0)之间的距离,θ线段与x-轴之间的夹角。因此,矩阵类型必须是CV_32FC2type. CV_HOUGH_PROBABILISTIC-概率Hough变换(如果图像包含一些长的线性分割,则效率更高).它返回线段分割而不是整个线段。每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是CV_32SC4. CV_HOUGH_MULTI_SCALE-传统Hough变换的多尺度变种。线段的编码方式与CV_HOUGH_STANDARD的一致。 rho:与象素相关单位的距离精度 theta:弧度测量的角度精度 threshold:阈值参数。如果相应的累计值大于threshold,则函数返回的这个线段. param1:第一个方法相关的参数: 对传统Hough变换,不使用(0). 对概率Hough变换,它是最小线段长度. 对多尺度Hough变换,它是距离精度rho的分母(大致的距离精度是rho而精确的应该是rho/param1). param2:第二个方法相关参数: 对传统Hough变换,不使用(0). 对概率Hough变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap),即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。 对多尺度Hough变换,它是角度精度theta的分母(大致的角度精度是theta而精确的角度应该是theta/param2). 函数cvHoughLines2实现了用于线段检测的不同Hough变换方法. Example.用Houghtransform检测线段 #include<cv.h> #include<highgui.h> #include<math.h> intmain(intargc,char**argv) { IplImage*src; if(argc==2&&(src=cvLoadImage(argv[1],0))!=0) { IplImage*dst=cvCreateImage(cvGetSize(src),8,1); IplImage*color_dst=cvCreateImage(cvGetSize(src),8,3); CvMemStorage*storage=cvCreateMemStorage(0); CvSeq*lines=0; inti; cvCanny(src,dst,50,200,3); cvCvtColor(dst,color_dst,CV_GRAY2BGR); #if1 lines=cvHoughLines2(dst,storage,CV_HOUGH_STANDARD,1,CV_PI/180,150,0,0); for(i=0;i<lines->total;i++) { float*line=(float*)cvGetSeqElem(lines,i); floatrho=line[0]; floattheta=line[1]; CvPointpt1,pt2; doublea=cos(theta),b=sin(theta); if(fabs(a)<0.001) { pt1.x=pt2.x=cvRound(rho); pt1.y=0; pt2.y=color_dst->height; } elseif(fabs(b)<0.001) { pt1.y=pt2.y=cvRound(rho); pt1.x=0; pt2.x=color_dst->width; } else { pt1.x=0; pt1.y=cvRound(rho/b); pt2.x=c