1

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

我认为 drawContourscnt由于这种差异而无法使用,但我不知道为什么会发生这种情况。

编辑:轮廓是由 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)
4

1 回答 1

0

问题是轮廓列表中的 3D 数组必须是 int32 类型。就我而言,我必须将 all_cnt 定义为 all_cnt.astype(np.int32)。

如果你没有使用 findContours 而你想使用 drawContours(),contours 参数应该如下所示:list(array,array,...),其中数组的 dtype 为 int32,每个数组如下所示:[ [ [x1, y1] ], [ [x2, y2] ], [ [x3, y3] ], [ [x4, y4] ], ... ]。每个数组包含 1 个对象的边界点。

于 2014-10-22T16:16:26.283 回答