Hough Transform 霍夫变换检测直线

从理论到代码,再从代码到理论

(1)理论之通俗理解:

1.在图像中检测直线的问题,其实质是找到构成直线的所有的像素点。那么问题就是从找到直线,变成找到符合y=mx+c的所有(x,y)的点的问题。

2.进行坐标系变化y=mx+c,变成c=-xm+y。直线上的点(x1,y1),在转换坐标系后为一条直线。这个原理应该是高中的。

3.直线上每一个点在MC坐标系中都表现为直线,而且,这些直线都相交于一个点,(m,c)。找到所有点的问题,转变为寻找直线的问题。

4.对于图像中的每一个点,在MC坐标系中对应着很多的直线。找到直线的交点,就对应着找到图像中的直线。

实际在使用这一原理的时候,不是采用直线的斜率和截距公式,而是用

如何实现:

1.       将θ角在-90度到90度的范围里,划分为很多区间,对所有的像素点(x,y)在所有θ角的时候,求出ρ.从而累加ρ值出现的次数。高于某个阈值的ρ就是一个直线。

2.       这个过程就类似于如下一个二维的表格,横坐标就是θ角,ρ就是到直线的最短距离。

横坐标θ不断变换,对于所有的不为0的像素点,计算出ρ,找到ρ在坐标(θ,ρ)的位置累加1.

3.       上图中局部最大的就是找到的直线的θ和ρ的值。

(2) 具体代码片段

for( ang = 0, n = 0; n < numangle; ang += theta, n++ )
    {
        tabSin[n] = (float)(sin(ang) * irho);
        tabCos[n] = (float)(cos(ang) * irho);
    }

// stage 1. fill accumulator
    for( i = 0; i < height; i++ )
        for( j = 0; j < width; j++ )
        {
            if( image[i * step + j] != 0 )
                for( n = 0; n < numangle; n++ )
                {
                    r = cvRound( j * tabCos[n] + i * tabSin[n] );
                    r += (numrho - 1) / 2;
                    accum[(n+1) * (numrho+2) + r+1]++;
                }
        }

// stage 2. find local maximums
    for( r = 0; r < numrho; r++ )
        for( n = 0; n < numangle; n++ )
        {
            int base = (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;
        }

// stage 3. sort the detected lines by accumulator value
    icvHoughSortDescent32s( sort_buf, total, accum );

// stage 4. store the first min(total,linesMax) lines to the output buffer
    linesMax = MIN(linesMax, total);
    scale = 1./(numrho+2);
    for( i = 0; i < linesMax; i++ )
    {
        CvLinePolar line;
        int idx = sort_buf[i];
        int n = cvFloor(idx*scale) - 1;
        int r = idx - (n+1)*(numrho+2) - 1;
        line.rho = (r - (numrho - 1)*0.5f) * rho;
        line.angle = n * theta;
        cvSeqPush( lines, &line );
    }

Hough Transform 霍夫变换检测直线相关推荐

  1. 霍夫变换检测圆c 语言,c++ 霍夫变换检测直线

    通常这是一幅边缘图像,比如来自 Canny算子.cv:: Houghlines函数的输出是 cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0).在下例中 我们首先应用 Cann ...

  2. OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测

    OpenCV-Python教程(9.使用霍夫变换检测直线) 相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同 ...

  3. python霍夫变换检测直线_OpenCV-Python教程(9、使用霍夫变换检测直线)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...

  4. python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...

  5. matlab霍夫变换检测直线原理,霍夫变换(霍夫变换检测直线原理)

    OpenCv里面有个概率霍夫变换,但是不知道原理是什么,请各位大侠指教!.. 霍夫变换就是利用参数空间中的(ρ,θ)来表示一条直线,其中ρ是原点到直线的垂直距离,θ是原点到直线的一条垂线段与θ的夹角. ...

  6. 霍夫直线检测python_python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意: ...

  7. c语言霍夫变换圆检测,Hough Transform(霍夫变换)检测Circle(圆)的几种方法

    比如检测直线中,直线方程y = k * x + b  ,   直线上的所有点都对应着参数( k , b), 给定一个点(x0 , y0)我们能够得到通过这个点的所有直线的参数(k , b),易知同一条 ...

  8. hough变换直线检测_python+opencv实现霍夫变换检测直线

    作者:Ruff_XY 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLi ...

  9. opencv 霍夫变换检测直线和圆

    霍夫变换 霍夫变换原理及python实现 opencv 霍夫直线变换 OpenCV中用cv.HoughLines()在二值图上实现霍夫变换,函数返回的是一组直线的(r,θ)数据: 函数中: 参数1:要 ...

最新文章

  1. webpack 编译stylus_webpack 文档更新日志(9.129.29)
  2. android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava
  3. 自动部署 管道 ci cd_自动化测试在CI CD管道中的作用
  4. 【转】Dicom格式文件解析器!!!!!!!
  5. Navicat工具导出mySQL数据库某个视图结构的.sql脚本
  6. 应用层协议:HTTP与HTTPS协议详解、二者的区别
  7. 记录:注意Unity返回的所有数组,只是数组的副本
  8. 罗马音平假名片假名转换器_零基础日语萌新该如何学习五十音?
  9. dba_tables 和 dba_segments 表中 blocks 的区别
  10. IDEA回到光标的上一次位置
  11. Golang Go 语言简介
  12. 泛泰A870 CWM Recovery En/Cn合集
  13. 听中科院研究员袁亚湘报告心得体会
  14. 该死的强迫症,教你stm32怎么把杜邦线弄整齐
  15. python风变编程和扇贝编程_想学习phython ,纠结是扇贝编程还是风变编程?
  16. C++代码审阅--ice104协议从站(1)
  17. R 回归 虚拟变量na_R语言 | 回归分析(一)
  18. JPA 之 detach方法的使用及注意事项
  19. Unity 接入第三方SDK打包闪退
  20. 世界顶尖PHP站Facebook后台技术探秘

热门文章

  1. 算法 字符串转换为以为数组
  2. Boost之正则表达式_[转]
  3. 百度程序员哀叹:回老家发现村里很多人开保时捷,道奇等豪车,比程序员有钱多了!...
  4. 从源码分析Hystrix工作机制
  5. 前腾讯员工不堪房价压力回老家进国企!终于过上了清闲的日子,他又担心这个问题?...
  6. 做程序员10年了,复制粘贴是我最牛逼的技能,从菜鸟兑变成大牛,直到看了这些大佬的公众号...
  7. 基于深度学习的目标检测技术的演进:从R-CNN到Faster R-CNN
  8. 互联网安全威胁及应对方案
  9. 敏捷开发中如何定义“完成”?
  10. 未来教育计算机三级课后题答案,未来教育计算机三级课后题答案