Hough Transform 霍夫变换检测直线
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) 具体代码片段
{
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 霍夫变换检测直线相关推荐
- 霍夫变换检测圆c 语言,c++ 霍夫变换检测直线
通常这是一幅边缘图像,比如来自 Canny算子.cv:: Houghlines函数的输出是 cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0).在下例中 我们首先应用 Cann ...
- OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测
OpenCV-Python教程(9.使用霍夫变换检测直线) 相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同 ...
- python霍夫变换检测直线_OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...
- python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...
- matlab霍夫变换检测直线原理,霍夫变换(霍夫变换检测直线原理)
OpenCv里面有个概率霍夫变换,但是不知道原理是什么,请各位大侠指教!.. 霍夫变换就是利用参数空间中的(ρ,θ)来表示一条直线,其中ρ是原点到直线的垂直距离,θ是原点到直线的一条垂线段与θ的夹角. ...
- 霍夫直线检测python_python+opencv实现霍夫变换检测直线
本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意: ...
- c语言霍夫变换圆检测,Hough Transform(霍夫变换)检测Circle(圆)的几种方法
比如检测直线中,直线方程y = k * x + b , 直线上的所有点都对应着参数( k , b), 给定一个点(x0 , y0)我们能够得到通过这个点的所有直线的参数(k , b),易知同一条 ...
- hough变换直线检测_python+opencv实现霍夫变换检测直线
作者:Ruff_XY 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLi ...
- opencv 霍夫变换检测直线和圆
霍夫变换 霍夫变换原理及python实现 opencv 霍夫直线变换 OpenCV中用cv.HoughLines()在二值图上实现霍夫变换,函数返回的是一组直线的(r,θ)数据: 函数中: 参数1:要 ...
最新文章
- webpack 编译stylus_webpack 文档更新日志(9.129.29)
- android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava
- 自动部署 管道 ci cd_自动化测试在CI CD管道中的作用
- 【转】Dicom格式文件解析器!!!!!!!
- Navicat工具导出mySQL数据库某个视图结构的.sql脚本
- 应用层协议:HTTP与HTTPS协议详解、二者的区别
- 记录:注意Unity返回的所有数组,只是数组的副本
- 罗马音平假名片假名转换器_零基础日语萌新该如何学习五十音?
- dba_tables 和 dba_segments 表中 blocks 的区别
- IDEA回到光标的上一次位置
- Golang Go 语言简介
- 泛泰A870 CWM Recovery En/Cn合集
- 听中科院研究员袁亚湘报告心得体会
- 该死的强迫症,教你stm32怎么把杜邦线弄整齐
- python风变编程和扇贝编程_想学习phython ,纠结是扇贝编程还是风变编程?
- C++代码审阅--ice104协议从站(1)
- R 回归 虚拟变量na_R语言 | 回归分析(一)
- JPA 之 detach方法的使用及注意事项
- Unity 接入第三方SDK打包闪退
- 世界顶尖PHP站Facebook后台技术探秘
热门文章
- 算法 字符串转换为以为数组
- Boost之正则表达式_[转]
- 百度程序员哀叹:回老家发现村里很多人开保时捷,道奇等豪车,比程序员有钱多了!...
- 从源码分析Hystrix工作机制
- 前腾讯员工不堪房价压力回老家进国企!终于过上了清闲的日子,他又担心这个问题?...
- 做程序员10年了,复制粘贴是我最牛逼的技能,从菜鸟兑变成大牛,直到看了这些大佬的公众号...
- 基于深度学习的目标检测技术的演进:从R-CNN到Faster R-CNN
- 互联网安全威胁及应对方案
- 敏捷开发中如何定义“完成”?
- 未来教育计算机三级课后题答案,未来教育计算机三级课后题答案