【问题标题】:Effective way to determine position of two lines确定两条线位置的有效方法
【发布时间】:2021-11-05 09:03:08
【问题描述】:

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

先看图

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

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

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

【问题讨论】:

  • 您可以使用inRangeOpenCV 来分离HSV 空间中的颜色,在RGB 空间中使用Numpy 的另一种解决方案是分离颜色通道和从绿色通道的平均值中分别找到红色通道的平均值
  • 您对“线段 A 在线段 B 的左侧”的(数学)定义是什么?如果绿色部分是水平的,它将如何工作?如果分段交叉怎么办?如果在第二张图片中,红色部分更进一步呢?
  • gamedev.net/forums/topic/… 但是你真的需要测试红线的两个端点,因为它可能会倾斜并越过绿线。
  • @Bilal 对不起,如果我不够清楚。线条和它们的坐标已经被清楚地识别出来了,所以这不是找到红色或绿色的问题。那已经完成了。问题是手段并不总是一个好的判断
  • @KansaiRobot 如果你有坐标,那么 OpenCV 和图像处理标签需要什么?从现在开始,这似乎是一件简单的事情。也许您只需要比较两条线的两端(而不是它们的中心点)。为了更加放心,最好根据您最近的评论在 math.stackexchange.com 上提出这个问题。

标签: python numpy opencv image-processing


【解决方案1】:

如果线条的交叉点是否延伸对您来说并不重要,则此想法有效。

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

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

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多