创建轮廓列表

时间:2014-10-22 09:20:38

标签: python opencv opencv-drawcontour

我有轮廓线(cnt)的(x,y)点。通过将数据结构与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 :(得分:0)

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

如果您不使用findContours并且想要使用drawContours(),则contours参数应如下所示:list(array,array,...),其中dtype of array为int32,每个数组看起来如下像这样:[[[x1,y1]],[[x2,y2]],[[x3,y3]],[[x4,y4]],...]。 每个数组包含1个对象的边界点。