创建轮廓列表

1 投票
1 回答
1353 浏览
提问于 2025-04-29 00:22

我有一些点(x,y)用来表示轮廓线,这些点存储在一个叫做 cnt 的列表里。通过对比这个列表和 findContours 函数返回的结果(叫做 contoure),我创建了一个看起来几乎一模一样的列表。cnt 是一个包含3D数组的列表,而 contoure 也是一个包含3D数组的列表。

我得到了以下结果:

len(cnt) = 140
len(contoure) = 140

cnt.shape = (20L,1L,2L)
contoure.shape = (20L,1L,2L)

np.size(cnt,0) = 140
np.size(contoure,0) = 140

np.size(cnt) = 5600
np.size(contoure) = 140

我不明白为什么在调用 np.size(contoure,1) 时会出现“元组索引超出范围”的错误(注意 contoure[i] 是3D数组!),而调用 np.size(cnt,1) 时却没有错误,另外 np.size(cnt) != np.size(contoure) 这又是为什么。

我猜测 drawContours 函数不能处理 cnt,可能就是因为这个差异,但我不知道为什么会这样。

编辑:轮廓是通过调用 findContours() 创建的。我不太清楚 cnt 是怎么生成的,因为那部分代码是我朋友写的,我只得到了以下形式的结果:
all_cnt:

x11 x12 ... x1n
y11 y12 ... y1n
.
.
xm1 xm2 ... xmn
ym1 ym2 ... ymn

其中 x1,y1 是描述第一个轮廓的 n 对坐标。然后我使用以下代码:

cnt=[]

for i in range(140):
    a=all_cnt[2*i:2*i+2]
    a = np.reshape(np.ravel(a,order='F'),(20,1,2))
    cnt.append(a)
暂无标签

1 个回答

0

问题是,列表中的3D数组必须是int32类型。在我的情况下,我需要把all_cnt定义为all_cnt.astype(np.int32)。

如果你没有使用findContours函数,而是想用drawContours(),那么contours参数应该像这样:list(array,array,...),其中每个数组的类型是int32,每个数组的格式是这样的:[ [ [x1, y1] ], [ [x2, y2] ], [ [x3, y3] ], [ [x4, y4] ], ... ]。每个数组里包含的是一个物体的边界点。

撰写回答