OpenCV的HoughLines以什么顺序列出[rho,theta]矩阵中检测到的行?

时间:2017-12-15 06:53:56

标签: python opencv image-processing straight-line-detection houghlines

当带有线的给定图像传递给OpenCV的HoughLine变换时,它返回rho和theta对的列表,每对定义一条单独的线。在这个rho,theta对列表中列出行的顺序是什么。

例如,当这个带有8行的图像用于python时, image with 8 line

以下,rho,theta矩阵返回八行。

[[ 461.            1.48352981]
 [ 380.            1.48352981]
 [ 212.            1.48352981]
 [ 112.            1.48352981]
 [  65.            1.48352981]
 [ 334.            1.48352981]
 [ 269.            1.48352981]
 [ 508.            1.48352981]]

此矩阵中此处列出行的顺序是如何由openCV确定的?

2 个答案:

答案 0 :(得分:3)

来自OpenCV源代码https://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp

函数HoughLinesStandard从第80行开始实现标准的hough变换。

如果我们向下滚动一点(第166行),我们会发现:

 // stage 3. sort the detected lines by accumulator value
    std::sort(_sort_buf.begin(), _sort_buf.end(), hough_cmp_gt(accum));

现在,行列表按累加器值递增排序。最好的linesMax结果放入输出缓冲区。

 // stage 4. store the first min(total,linesMax) lines to the output buffer
    linesMax = std::min(linesMax, (int)_sort_buf.size());
    double scale = 1./(numrho+2);
    for( i = 0; i < linesMax; i++ )
    {
        LinePolar 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 = static_cast<float>(min_theta) + n * theta;
        lines.push_back(Vec2f(line.rho, line.angle));

如果您不知道累加器值是什么,请阅读Hough变换的工作原理。 https://en.wikipedia.org/wiki/Hough_transform

它基本上表示有多少像素贡献给那个rho theta对。

答案 1 :(得分:1)

可能是它们以字典(r,Θ)或(Θ,r)顺序返回,因此您的平行线将通过增加距离原点的距离或随机(角度的顺序是不可预测的)来实现。

函数的设计者没有理由强制执行特定的顺序,因为在一般情况下没有行的逻辑(并行或准平行的行是例外)。

如果您需要特定订单,则由您来指定和实施。例如,通过增加r进行排序,当Θ进行半转时,注意分配负号。您还可以使用垂直方向对交叉点的纵坐标进行排序。

在仔猪发现之后,他们会被力量归还。我的上一段仍然适用。