您的位置:首页 > 编程语言

利用霍夫变换做直线检测的原理及OpenCV代码实现

2016-06-28 14:17 567 查看
霍夫变换的原理大家可以参考博文 http://blog.csdn.net/tiemaxiaosu/article/details/50982893

说白了,以直线检测为例,霍夫变换实际上就是把使每个像素坐标点经过变换都变成都直线特质有贡献的统一度量(这种度量以我目前的理解与笛卡尔(极坐系)并无区别,即极半径和极角),并对转换后的度量进行累计(可以理解为投票),当一个波峰出现时候,说明有直线存在。如果要了解更详细的,大家还是参考上面那篇博文吧!

霍夫变换进行直线检测分为两种实现方式:标准霍夫变换和概率霍夫变换。标准霍夫变换在OpenCV中的实现函数是HoughLines,概率霍夫变标准在OpenCV中的实现函数是HoughLinesP。

标准霍夫变换本质上是把图像映射到它的参数空间上,它需要计算所有的M个边缘点,这样它的运算量和所需内存空间都会很大。如果在输入图像中只是处理m(m<M)个边缘点,则这m个边缘点的选取是具有一定概率性的,因此该方法被称为概率霍夫变换(Probabilistic Hough Transform)。

由于标准霍夫变换的运算量和所需内存空间会很大,所以这里就分析和实现这种不经济的算法,直接看概率霍夫变换函数HoughLinesP吧!函数原型如下:

void HoughLinesP( InputArray image, OutputArray lines,double rho, double theta, int threshold,double minLineLength=0, double maxLineGap=0 );

image为输入图像,要求是8位单通道图像
lines为输出的直线向量,每条线用4个元素表示,即直线的两个端点的4个坐标值
rho和theta分别为距离和角度的分辨率,我觉得可以理解为极坐系中r和θ的分辨率
threshold为阈值,它表示要判断为一条直线所需的最少度量,显然这个值越大,所判断出的直线越少;这个值越小,所判断出的直线越多。

minLineLength:根据threshold提取出的直线长短不一,这个参数以长度对这些直线作一次筛选,小于这个参数值的就被抛弃。显然这个值越大,所判断出的直线越少;这个值越小,所判断出的直线越多。

maxLineGap:最大直线间隙,即如果有两条线段在一条直线上,但它们之间因为有间隙,所以被认为是两个线段,如果这个间隙大于该值,则被认为是两条线段,否则是一条。显然这个值越大,所判断出的直线越少;这个值越小,所判断出的直线越多(怎么理解?值越小,那么间隙值就越容易大于这个值啊)

下面给出使用HoughLinesP作直线检测的源码:

相关内容已迁移到帖子 http://opencv66.net/thread-36-1-1.html

相关内容已迁移到帖子 http://opencv66.net/thread-36-1-1.html

相关内容已迁移到帖子 http://opencv66.net/thread-36-1-1.html

如果需要查看HoughLinesP中不同参数对结果的影响,可以参考博文http://blog.csdn.net/u013634684/article/details/49076329
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息