【问题标题】:I have an issue while drawing the lines over an image using pair of coordinates using opencv python使用opencv python使用坐标对在图像上绘制线条时遇到问题
【发布时间】:2020-04-06 12:18:58
【问题描述】:

我有一组来自图像的坐标。使用这些坐标,我想在图像上绘制线条。在尝试时,我遇到了错误。请帮我解决这个问题。下面是代码。

[((line[0, 0], line[0, 1]), (line[1, 0], line[1, 1])) for line in lines[:nlines]]

print(lines[:lines])

for i in lines:
    x1,y1,x2,y2=i[0]
    cv2.line(image,(x1,y1),(x2,y2),(255,0,0),2)

cv2.imshow("Image",image)
cv2.waitKey(0)

错误:

x1,y1,x2,y2=line[0]

ValueError: not enough values to unpack (expected 4, got 2)

积分输出:

[[[1150  327]
  [1166  316]]

 [[1146  475]
  [1158  467]]

 [[ 903  322]
  [ 911  320]]

 ...

 [[ 364  403]
  [ 374  402]]

 [[ 644  570]
  [ 649  569]]

 [[ 249  645]
  [ 255  644]]]

【问题讨论】:

    标签: python opencv image-processing hough-transform straight-line-detection


    【解决方案1】:

    问题是每条线由两个点定义。

    从您的打印中,您可以看到数据排列。

    例子:

    a = [[[1150  327]
          [1166  316]]
    
         [[1146  475]
          [1158  467]]]
    

    上面的数据排列是:两个数组,包含两个数组,包含两个数值。
    层次结构是由数组数组构建的数组(或由列表列表构建的列表)。
    非常混乱的结构...

    如您所见,有两个“组”的层次结构:

    • a[0] 等于 [[1150 327] [1166 316]]
    • a[1] 等于 [[1146 475] [1158 467]]

    分成小组:

    • a[0] 等于 [[1150 327] [1166 316]]
      • a[0][0] 等于 [1150 327]
      • a[0][1] 等于 [1166 316]
    • a[1] 等于 [[1146 475] [1158 467]]
      • a[1][0] 等于 [1150 327]
      • a[1][1] 等于 [1158 467]

    获取数值:a[0][0][0] 等于 1150


    x1, y1, x2, y2=line[0] 给你一个错误,因为line[0] 是由两个数组/列表构建的:
    你试图得到 4 个值,白色只有 2 个,所以你得到一个错误。

    示例:
    line[0] 等于 [[1150 327] [1166 316]]

    你可以认为是p0p1两个点,使用语法:

    p0, p1 = line[0]
    

    Python 允许使用“奇怪”的语法——获取两个元组中的值:

    (x1, y1), (x2, y2) = line[0]
    

    这里是一个迭代 NumPy 线条数组并绘制线条的示例代码示例:

    import cv2
    import numpy as np
    
    # Array of lines:
    lines = np.array([[[1150, 327], [1166, 316]],
                      [[1146, 475], [1158, 467]],
                      [[ 903, 322], [ 911, 320]],                 
                      [[ 364, 403], [ 374, 402]],
                      [[ 644, 570], [ 649, 569]],
                      [[ 249, 645], [ 255, 644]]])
    
    # Create black image (resolution 1200x1000)
    image = np.zeros((1200, 1000, 3), np.uint8)
    
    # Iterate lines:
    for line in lines:
        (x1, y1), (x2, y2) = line
        cv2.line(image, (x1,y1), (x2,y2), (255,0,0), 2)
    
    cv2.imshow("Image", image)
    cv2.waitKey(0)
    

    注意:
    我从您的帖子中获取了“点输出”,并构建了一个 NumPy 数组。
    在您的情况下,您可能必须迭代 lines[0](很难从您的帖子中看出)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多