确定两条直线位置的有效方法

2024-09-21 03:06:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

首先看图片 lines

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

问题是当某些线条很小时,如右图所示。 你可以直观地知道红线仍然在绿线的“左边”。然而,如果我们看到了方法,这一次意味着_red>;我的意思是绿色

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


Tags: 方法ltnumpy图片中心opencv线条平均值
1条回答
网友
1楼 · 发布于 2024-09-21 03:06:07

如果两条线的交点在延伸时对您来说无关紧要,则此想法可行

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")

视觉输出:

enter image description here

打印输出:

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


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

现在可能会出现其他情况。如果我们继续这些线,如果它们不平行,这些线就会相交。如果您想知道这些线将在哪个位置相对。首先,您需要检查两行的calculate the equation。然后对于交点,搜索LineLineIntersection以找到相关的数学方程

相关问题 更多 >

    热门问题