У меня проблема при рисовании линий на изображении с использованием пары координат с использованием opencv python - PullRequest
1 голос
/ 06 апреля 2020

У меня есть набор координат из изображения. Используя эти координаты, я хотел нанести линии на изображение. При попытке у меня возникла ошибка. Пожалуйста, помогите мне с этим вопросом. Ниже приведен код.

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

1 Ответ

2 голосов
/ 08 апреля 2020

Проблема в том, что каждая линия определяется двумя точками.

Из вашей печати вы можете увидеть расположение данных.

Пример:

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]

Получение значения цифры c: a[0][0][0] равно 1150.


x1, y1, x2, y2=line[0] выдает ошибку, поскольку line[0] состоит из двух массивов / списков:
Вы пытаетесь получить 4 значения, белых - только 2, поэтому вы получаете ошибка.

Пример:
line[0] равно [[1150 327] [1166 316]]

Вы можете представить себе две точки p0 и p1 и использовать синтаксис:

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] (это сложно отличить по вашему посту).

...