使用 opencv python 使用一对坐标在图像上绘制线条时遇到问题

I have an issue while drawing the lines over an image using pair of coordinates using opencv python

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

[((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]]]

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

从你的打印可以看出数据的排列。

示例:

a = [[[1150  327]
      [1166  316]]

     [[1146  475]
      [1158  467]]]

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

如您所见,有两个 "groups" 的层次结构:

  • 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] 是由两个 arrays/lists:
构建的 您正在尝试获取 4 个值,白色只有 2 个,因此出现错误。

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

你可以把is看作两点p0p1,并使用语法:

p0, p1 = line[0]

Python 允许 "weird" 语法 - 获取两个元组中的值:

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

注:
我从你的 post 中获取了 "Points Output",并构建了一个 NumPy 数组。
可能是在你的情况下你必须迭代 lines[0] (很难从你的 post 中分辨出来)。