首页 > 解决方案 > 确定两条线位置的有效方法

问题描述

我正在尝试确定两条线的位置,到目前为止使用 numpy,但如有必要,我愿意使用 opencv。

先看图 线条

我正在使用 X 坐标的方法。所以在第一张图片中,你可以看到中心的斑点是每条线的 X 坐标平均值的位置。您可以清楚地看到红线在绿线的“左侧”(因为 mean_read < mean_green)

问题是当一些线条像右边的图片那样很小时。您可以直观地知道,红线仍然在绿线的“左侧”。但是,如果我们看到均值,这一次 mean_red > mean_green。

有没有更好的方法使用 numpy 甚至使用 opencv 来正确确定绿线在红线的右侧?

标签: pythonnumpyopencvimage-processing

解决方案


如果线的交点对你来说并不重要,如果它们延伸,这个想法就有效。

im = cv2.imread(sys.path[0]+'/im.png')
gr = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
bw = cv2.threshold(gr, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

cnts, _ = cv2.findContours(~bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
gMid, g1, g2, gColor = None, None, None, (100, 255, 50)
rMid, r1, r2, rColor = None, None, None, (100, 50, 255)
for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(im, (x, y), (x+w, y+h), (127, 127, 127), 2)
    ROI = im[y:y+h, x:x+w]
    if np.mean(ROI[:, :, 1]) > np.mean(ROI[:, :, 2]): # Green line
        g1, g2 = ((x, y), (x+w, y+h))[:2] if ROI[0, 0, 0] == 255 else ((x+w, y), (x, y+h))[:2]
        gMid = (x+w//2, y+h//2)
    else: # red line
        r1, r2 = ((x, y), (x+w, y+h))[:2] if ROI[0, 0, 0] == 255 else ((x+w, y), (x, y+h))[:2]
        rMid = (x+w//2, y+h//2)

# Draw coordinates of green line
for p in [gMid, g1, g2]:
    cv2.circle(im, p, 20, gColor, 5)

# Draw coordinates of red line
for p in [rMid, r1, r2]:
    cv2.circle(im, p, 20, rColor, 5)

# Swap (Sort) green line start and end points
if r1[0]>r2[0]:
    r1,r2=r2,r1

# Swap (Sort) red line start and end points
if g1[0]>g2[0]:
    g1,g2=g2,g1

if r1[0] < g1[0] and r2[0] < g2[0]:
    print("x-axis --- Red line is left")
elif r1[0] > g1[0] and r2[0] > g2[0]:
    print("x-axis --- Green line is left")
elif r1[0] > g1[0] and r2[0] < g2[0]:
    print("x-axis --- Red is inside Green zone")
else:
    print("Something else")

视觉输出:

在此处输入图像描述

打印输出:

# For left sample:
# x-axis --- Red line is left


# For right sample:
# x-axis --- Red is inside Green zone

现在可能会出现其他情况。如果我们继续这些线,如果它们不平行,它们将相交。如果您想知道这些线相对于彼此的位置。首先,您需要计算两条线的方程。然后对于交点,搜索LineLineIntersection找到相关的数学方程。


推荐阅读