资源描述:
《学习opencv标准hough变换函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、学习OpenCV标准Hough变换函数2009-12-1722:52:31
2、分类:OLD
3、标签:hough变换opencv
4、字号订阅 Hough变换找直线的程序实在是做得纠结,看原理似乎很简单,但实际做起来还是碰到了不少问题。最主要的就是当theta-rho空间中有几个相邻点的计数值都超过阈值时的取舍问题,整了一下午还是想不出很么好办法。晚上抱着敬畏的心理读了以下OpenCV的源码,感觉受益匪浅。 首先眼前一亮的是cos值和sin值的计算,icvHoughLinesStandard的处理方式是先把所有要用的都计算出来,存到数组里面。这样以来就避免了大量的重复计
5、算,这对提高Hough变换的效率大有帮助。 接着看到的就是那个令我纠结的问题,这里先贴一下OpenCV中的代码:intbase=(n+1)*(numrho+2)+r+1;if(accum[base]>threshold&&accum[base]>accum[base-1]&&accum[base]>=accum[base+1]&&accum[base]>accum[base-numrho-2]&&accum[base]>=accum[base+numrho+2])sort_buf[total++]=base; 如果仅仅通过累加器中的值是否大于阈值来判断数据的有
6、效性不能达到令人满意的效果,因此还比较了当前累加器单元及其四邻域的值,这样能够近似的到一个令人满意的结果。起初以为这么做存在一个小BUG:当两个相等的accum值挨在一起时,若它们又比周围其它值都要大,那么这条直线就被水掉了。后来发现每个元素与其右或下的元素比较时用的是“>=”而不是">",这样就保证了不会丢失直线,不过精度有所下降——如果要保证精度,需要大大增加计算量,故这里的精度损失也是可接受的。 这个函数一共标注了4个stage,第三个是一个排序,起初不解,后来明白当遇到linesMax<=total的情况时,这一个步骤保证了把"最像直线的直线"输出。附:
7、读代码时做的注释src/cv/cvhough.cpp......staticvoidicvHoughLinesStandard(constCvMat*img,floatrho,floattheta,intthreshold,CvSeq*lines,intlinesMax){int*accum=0;otherstaffoftheCentre.Duringthewar,ZhuwastransferredbacktoJiangxi,andDirectorofthenewOfficeinJingdezhen,JiangxiCommitteeSecretary.Starti
8、ngin1939servedasrecorderoftheWestNorthOrganization,SecretaryoftheSpecialCommitteeAfterthevictoryofthelongMarch,hehasbeentheNorthwestOfficeoftheFederationofStateenterprisesMinister,ShenmufuguSARmissions,DirectorofNingxiaCountypartyCommitteeSecretaryandrecorderoftheCountypartyCommitteeS
9、ecretary,Ministersandint*sort_buf=0;float*tabSin=0;float*tabCos=0;CV_FUNCNAME("icvHoughLinesStandard");__BEGIN__;constuchar*image;intstep,width,height;intnumangle,numrho;inttotal=0;floatang;intr,n;inti,j;floatirho=1/rho;doublescale;CV_ASSERT(CV_IS_MAT(img)&&CV_MAT_TYPE(img->type)==CV_
10、8UC1);/*指向矩阵数据的uchar*指针*/image=img->data.ptr;/*以字节为单位的行数据长度*/step=img->step;/*以元素为单位的行数据长度*/width=img->cols;/*行数,即高度*/height=img->rows;/*通过弧度精度计算出来的弧度分块数目*/numangle=cvRound(CV_PI/theta);/*通过像素精度计算出来的像素分块数目*/numrho=cvRound(((width+height)*2+1)/rho);/*补充:cvRound是取整函数,返回和参数最接近的整数值*//*分配存
11、储空间*/