学习OpenCV标准Hough变换函数.doc

学习OpenCV标准Hough变换函数.doc

ID:59357499

大小:58.00 KB

页数:8页

时间:2020-09-04

学习OpenCV标准Hough变换函数.doc_第1页
学习OpenCV标准Hough变换函数.doc_第2页
学习OpenCV标准Hough变换函数.doc_第3页
学习OpenCV标准Hough变换函数.doc_第4页
学习OpenCV标准Hough变换函数.doc_第5页
资源描述:

《学习OpenCV标准Hough变换函数.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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++]=

6、base;  如果仅仅通过累加器中的值是否大于阈值来判断数据的有效性不能达到令人满意的效果,因此还比较了当前累加器单元及其四邻域的值,这样能够近似的到一个令人满意的结果。起初以为这么做存在一个小BUG:当两个相等的accum值挨在一起时,若它们又比周围其它值都要大,那么这条直线就被水掉了。后来发现每个元素与其右或下的元素比较时用的是“>=”而不是">",这样就保证了不会丢失直线,不过精度有所下降——如果要保证精度,需要大大增加计算量,故这里的精度损失也是可接受的。  这个函数一共标注了4个stage,第三个是一个排序,起初不解,后来

7、明白当遇到linesMax<=total的情况时,这一个步骤保证了把"最像直线的直线"输出。附:读代码时做的注释src/cv/cvhough.cpp......staticvoidicvHoughLinesStandard(constCvMat*img,floatrho,floattheta,intthreshold,CvSeq*lines,intlinesMax){int*accum=0;int*sort_buf=0;float*tabSin=0;float*tabCos=0;CV_FUNCNAME("icvHoughLinesS

8、tandard");__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_8UC1);/*指向矩阵数据的uchar*指针*/image=img->data.ptr;/*以字节为单位的行数据长度*/step=img->step;/

9、*以元素为单位的行数据长度*/width=img->cols;/*行数,即高度*/height=img->rows;/*通过弧度精度计算出来的弧度分块数目*/numangle=cvRound(CV_PI/theta);/*通过像素精度计算出来的像素分块数目*/numrho=cvRound(((width+height)*2+1)/rho);/*补充:cvRound是取整函数,返回和参数最接近的整数值*//*分配存储空间*//*这里给accum多分配了一圈的空间,是为了方便后面用3*3的模板做运算*/CV_CALL(accum=(in

10、t*)cvAlloc(sizeof(accum[0])*(numangle+2)*(numrho+2)));CV_CALL(sort_buf=(int*)cvAlloc(sizeof(accum[0])*numangle*numrho));CV_CALL(tabSin=(float*)cvAlloc(sizeof(tabSin[0])*numangle));CV_CALL(tabCos=(float*)cvAlloc(sizeof(tabCos[0])*numangle));/*将累加器矩阵清零*/memset(accum,0,si

11、zeof(accum[0])*(numangle+2)*(numrho+2));/*建立Sin和Cos查询表,以提高运算效率*/for(ang=0,n=0;n

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。