代码之家  ›  专栏  ›  技术社区  ›  BlueTrack

在两个给定点之间绘制线(OpenCV、Python)

  •  8
  • BlueTrack  · 技术社区  · 7 年前

    到现在为止,我已经为这个问题挣扎了一个小时。。。

    我有一个里面有一个矩形的图像:

    rect

    这是我为寻找角点而编写的代码:

    import cv2
    import numpy as np
    
    
    img = cv2.imread('rect.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    
    points = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
    points = np.int0(points)
    
    for point in points:
        x, y = point.ravel()
        cv2.circle(img, (x, y), 3, (0, 255, 0), -1)
    
    print(points[0])
    print(points[1])
    print(points[2])
    print(points[3])
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.imwrite('rect.png', img)
    

    结果如下:

    rst

    正如你所见,它工作得很完美。我想要的是沿着上/下点(x1,x2-x3,x4)画一条线。

    我从现在开始制作的是。。。

    cv2.line(img, (points[0]), (points[1]), (0, 255, 0), thickness=3, lineType=8)
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    

    但它不起作用。

    知道吗?

    结果应该是这样的:

    out

    这两条线必须沿着点的坐标通过。 print(points[0]) 上面给出了下一个输出,例如:

    [[561 168]]
    [[155 168]]
    [[561  53]]
    [[155  53]] 
    

    谢谢

    2 回复  |  直到 7 年前
        1
  •  7
  •   api55    7 年前

    首先,让我们看看你们的指纹,它说点[0]是

    [[561 168]]
    

    (561, 168)
    

    你可以像对圆一样解包,然后做元组

    x, y = points[0].ravel()
    (x,y)
    

    或者你可以使用

    tuple(points[0].ravel())
    

    tuple(points[0][0])
    

    编辑

    你想要从屏幕的一边到另一边,这也很容易。您需要做的是将一个点的x值更改为0,将另一个点的列值更改为0。我认为最简单的方法是这样做:

    y = points[0].ravel()[1]
    cv2.line(img, (0, y), (img.shape[1], y), (0, 255, 0), thickness=3, lineType=8)
    

    这里需要注意两件事:

    1. 正如你们所见,我并不关心第二点,因为我假设 它将在同一条水平线上,如果不是,它将得到一个 有点复杂,但不难。

    2. img。形状返回 图像细节为(行、列、通道)的元组,因为我们 需要我们服用的感冒药[1]。

        2
  •  5
  •   Kinght 金    7 年前
    points = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
    points = np.int0(points).reshape(-1,2)
    
    for point in points:
        x, y = point.ravel()
        cv2.circle(img, (x, y), 3, (0, 255, 0), -1)
    
    
    y1 = min(points[:,1])
    y2 = max(points[:,1])
    
    ## small and big enough 
    cv2.line(img, (0, y1), (1000, y1), (0, 255, 0), thickness=3, lineType=8)
    cv2.line(img, (0, y2), (1000, y2), (0, 255, 0), thickness=3, lineType=8)
    
    推荐文章