opencv中标准Hough变换检测出的直线参数

    前几天在图像处理中用到了opencv的函数检测图像中的直线,当时对于获取的直线参数有一点点误解。

    首先,简单的介绍下Opencv中的hough变换:

    Opencv支持两种不同形式的hough变换:标准hough变换和累积概率hough变换。opencv中用同一个函数 cvHoughLines2( ...)来访问这两个算法。对于详细的部分这里不是介绍的重点,我这里只是想说下我在具体实现中遇到的一些问题。

                                                       

   (1) cvHoughLines2( ...) 返回的倾斜角的理解。

    我这里要讨论的是标准hough变换中返回的line[1],我们知道其表示直线的倾斜角

    起初我获得函数返回的倾斜角theta时,相当然的以为当theta = PI /2时,直线是垂直的,显然是不对的,直线水平时,极坐标下,theta才为垂直角,以后要小心。

 

    (2)hough变换直线检测思想。

    hough直线变换的基本理论是二值图像中的任何点都可能是一些候选直线集合的一部分,所选的参数方式是每一行代表极坐标中的一个点,并且隐含的直线是通过象征点的,垂直于原点到此点的半径(  《学习opencv》)

    我想这里要强调的是从图像中的一个个像素点出发,寻找每个点成为直线一部分的可能,再把这条线上可能的点连起来形成直线。所以在实际中,不用担心当一条线出现凹陷或是弯曲度时,会一点都检测不出直线的问题。会检测出直线,只是不是一条完整长度直线,而是断断续续重叠相近的很多直线。

opencv欧氏距离 opencv 距离变换_hough变换

                                                                                           (a) 原图

opencv欧氏距离 opencv 距离变换_函数返回_02

                                                                                           (b)hough直线检测

    我们这里可以从图像中清楚的看到,检测到的直线并不是一条从图像左端到右端的完整直线,而是很多小的直线,很接近,相连接。

 

    (3)关于line[0] 和line[1]的问题。

    选择不同形式的hough变换直线检测类型,line[0]和line[1]表示的意思是不同的。这里两种形式的hough检测方法是通过函数cvHoughLines2的的参数method来区分的。

    method可以是CV_HOUGH_STANDRD ( 标准hough)  和 CV_HOUGH_PROBABILISTIC(概率累积hough)

     (i)在标准hough中,对于返回的每条直线:

            float* line = ( float* ) cvGetSeqElem( lines,i)  

            line[ 0 ] 表示矢量长度(rho_x来表示)                     line[1]表示直线的倾斜角(theta_x来表示)

 

     (ii)在概率hough变换中,line[0]  和line[1]表示返回直线的两个端点