使用 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看作两点p0
和p1
,并使用语法:
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 中分辨出来)。
我有一组来自图像的坐标。我想使用这些坐标在图像上绘制线条。在尝试时我遇到了一个错误。请帮我解决这个问题。下面是代码。
[((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看作两点p0
和p1
,并使用语法:
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 中分辨出来)。