首页 > 技术文章 > c++ 霍夫变换检测直线

zendu 2017-08-11 15:30 原文

通常这是一幅边缘图像,比如来自 Canny算子。cv:: Houghlines函数的输出是
cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0)。在下例中
我们首先应用 Canny算子获取图像轮廓,然后基于霍夫变换检测直线

这个函数的的表达直线的方式用的不习惯的话可以用下面这个。

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分别为距离和角度的分辨率

threshold为阈值,即步骤3中的阈值

minLineLength为最小直线长度,在步骤5中要用到,即如果小于该值,则不被认为是一条直线

maxLineGap为最大直线间隙,在步骤4中要用到,即如果有两条线段是在一条直线上,但它们之间因为有间隙,所以被认为是两个线段,如果这个间隙大于该值,则被认为是两条线段,否则是一条。

 

http://blog.csdn.net/viewcode/article/details/8090932

 http://blog.csdn.net/zhaocj/article/details/40047397

int main()
{
    Mat img = imread("D:\\pdf2jpg\\nn\\00010.jpg");

    //GetRedComponet(img);
    Mat contours,res;
    Canny(img,contours,125,350);
    cvtColor( contours, res, CV_GRAY2BGR );  
    vector<Vec4i> lines;  
    HoughLinesP(contours, lines, 1, CV_PI/180, 80, 30, 10 );  
    for( size_t i = 0; i < lines.size(); i++ )  
    {  
        Vec4i l = lines[i];  
        line(res, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 2);  
    }  
    imwrite("D:\\dst1.jpg",res);
}

 统计概论霍夫直线检测houghlinesP是一个改进,不仅执行效率较高,而且能检测到直线的两个端点。
思想:
先随机检测出一部分直线,然后将直线上点的排查掉,再进行其他直线的检测

1. 首先仅统计图像中非零点的个数,对于已经确认是某条直线上的点就不再变换了。
2. 对所以有非零点逐个变换到霍夫空间
    a. 并累加到霍夫统计表(图像)中,并统计最大值
    b. 最大值与阈值比较,小于阈值,则继续下一个点的变换
    c. 若大于阈值,则有一个新的直线段要产生了
    d. 计算直线上线段的端点、长度,如果符合条件,则保存此线段,并mark这个线段上的点不参与其他线段检测的变换

推荐阅读