学习opencv标准hough变换函数_第1页
学习opencv标准hough变换函数_第2页
学习opencv标准hough变换函数_第3页
学习opencv标准hough变换函数_第4页
学习opencv标准hough变换函数_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习 OpenCV 标准 Hough 变换函数 2009-12-17 22:52:31| 分类: OLD | 标签:hough 变换 opencv |字号 订阅 Hough 变换找直线的程序实在是做得纠结,看原理似乎很简单,但实际做起来还是碰 到了不少问题。最主要的就是当 theta-rho 空间中有几个相邻点的计数值都超过阈值时的取 舍问题,整了一下午还是想不出很么好办法。晚上抱着敬畏的心理读了以下 OpenCV 的源 码,感觉受益匪浅。 首先眼前一亮的是 cos 值和 sin 值的计算,icvHoughLinesStandard 的处理方式是先 把所有要用的都计算出来,存到数组里面。这样以来就避免了大量的重复计算,这对提高 Hough 变换的效率大有帮助。 接着看到的就是那个令我纠结的问题,这里先贴一下 OpenCV 中的代码: int base = (n+1) * (numrho+2) + r+1; if( accumbase threshold 如果仅仅通过累加器中的值是否大于阈值来判断数据的有效性不能达到令人满意的效 果,因此还比较了当前累加器单元及其四邻域的值,这样能够近似的到一个令人满意的结 果。起初以为这么做存在一个小 BUG: 当两个相等的 accum 值挨在一起时,若它们又比 周围其它值都要大,那么这条直线就被水掉了。后来发现每个元素与其右或下的元素比较 时用的是“=”而不是“,这样就保证了不会丢失直线,不过精度有所下降如果要保 证精度,需要大大增加计算量,故这里的精度损失也是可接受的。 这个函数一共标注了4个 stage,第三个是一个排序,起初不解,后来明白当遇到 linesMax type) = CV_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 是取整函数,返回和参数最接近的整数值 */ /* 分配存储空间 */ /* 这里给 accum 多分配了一圈的空间,是为了方便后面用3*3的模板做运算 */ CV_CALL( accum = (int*)cvAlloc( sizeof(accum0) * (numangle+2) * (numrho+2) ); CV_CALL( sort_buf = (int*)cvAlloc( sizeof(accum0) * numangle * numrho ); CV_CALL( tabSin = (float*)cvAlloc( sizeof(tabSin0) * numangle ); CV_CALL( tabCos = (float*)cvAlloc( sizeof(tabCos0) * numangle ); /* 将累加器矩阵清零 */ memset( accum, 0, sizeof(accum0) * (numangle+2) * (numrho+2) ); /* 建立 Sin 和 Cos 查询表,以提高运算效率 */ for( ang = 0, n = 0; n threshold / stage 3. sort the detected lines by accumulator value /* 对结果进行排序,这么做是为下面的 linesMaxtype ) | (mat-rows != 1 if( CV_MAT_TYPE( mat-type ) != lineType ) CV_ERROR( CV_StsBadArg, “The destination matrix data type is inappropriate, see the manual“ ); CV_CALL( lines = cvMakeSeqHeaderForArray( lineType, sizeof(CvSeq), elemSize, mat-data.ptr, mat-rows + mat-cols - 1, linesMax = lines-total; CV_CALL( cvClearSeq( lines ); /* 若都不是则表示出错了 */ else CV_ERROR( CV_StsBadArg, “Destination is not CvMemStorage* nor CvMat*“ ); iparam1 = cvRound(param1); iparam2 = cvRound(param2); /* Hough 变换至此才正式开始,依据 method 值使用不同的 Hough 变换策略 */ switch( method ) case CV_HOUGH_STANDARD: CV_CALL( icvHoughLinesStandard( img, (float)rho, (float)theta, threshold, lines, linesMax ); break; case CV_HOUGH_MULTI_SCALE: CV_CALL( icvHoughLinesSDiv( img, (float)rho, (float)theta, threshold, iparam1, iparam2, lines, linesMax ); break; case CV_HOUGH_PROBABILISTIC: CV_CALL( icvHoughLinesProbabalistic( img, (float)rho, (float)theta, threshold, iparam1, iparam2, lines, linesMax ); break; default: CV_ERROR( CV_StsBadArg, “Unrecognized method

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论