Проблема в том, что каждая линия определяется двумя точками.
Из вашей печати вы можете увидеть расположение данных.
Пример:
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]
(это сложно отличить по вашему посту).