11

我有一张图片,里面有一些形状。我使用霍夫线检测到线。如何检测哪些线是平行的?

4

3 回答 3

15

笛卡尔坐标中的直线方程:

y = k * x + b

两条线 y = k1 * x + b1,y = k2 * x + b2 是平行的,如果 k1 = k2。

因此,您需要为每条检测到的线计算系数 k。

为了唯一标识一条线的方程,您需要知道属于该线的两点的坐标。

在找到带有 HoughLines (С++) 的行之后:

vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );

你有矢量线,它将检测到的线的参数(r,theta)存储在极坐标中。您需要在笛卡尔坐标中传输它们:

这里是 C++ 中的示例:

for( size_t i = 0; i < lines.size(); i++ )
{
  float rho = lines[i][0], theta = lines[i][1];
  Point pt1, pt2;
  double a = cos(theta), b = sin(theta);
  double x0 = a*rho, y0 = b*rho;
  pt1.x = cvRound(x0 + 1000*(-b)); //the first point
  pt1.y = cvRound(y0 + 1000*(a)); //the first point
  pt2.x = cvRound(x0 - 1000*(-b)); //the second point
  pt2.y = cvRound(y0 - 1000*(a)); //the second point
}

在得到一条线的这两个点后,您可以计算它的方程。

于 2013-04-03T06:53:37.937 回答
4

HoughLines 以极坐标返回其结果。所以只需检查角度的第二个值。无需转换为 x,y

def findparallel(lines):

lines1 = []
for i in range(len(lines)):
    for j in range(len(lines)):
        if (i == j):continue
        if (abs(lines[i][1] - lines[j][1]) == 0):          
             #You've found a parallel line!
             lines1.append((i,j))


return lines1
于 2017-09-12T20:48:08.583 回答
2

正如约翰提出的,最简单的方法是检测相似的角度。OpenCVs HoughLines 函数通过它到原点的距离和角度来表示一条线。

在此处输入图像描述

所以你基本上可以做的是用层次聚类算法对不同的角度进行聚类:

from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import ward, fcluster    

img = cv2.imread('images/img01.bmp')
img_canny = cv2.Canny(img, 50, 200, 3)

lines = cv2.HoughLines(img_canny, 1, 5* np.pi / 180, 150)

def find_parallel_lines(lines):

    lines_ = lines[:, 0, :]
    angle = lines_[:, 1]

    # Perform hierarchical clustering

    angle_ = angle[..., np.newaxis]
    y = pdist(angle_)
    Z = ward(y)
    cluster = fcluster(Z, 0.5, criterion='distance')

    parallel_lines = []
    for i in range(cluster.min(), cluster.max() + 1):
        temp = lines[np.where(cluster == i)]
        parallel_lines.append(temp.copy())

    return parallel_lines
于 2021-10-26T11:39:56.010 回答