2014-10-22 69 views
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)

由于这种差异,我认为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

你是如何创建'cnt'或'contoure'的? – 2014-10-22 09:40:08

+0

我编辑了我原来的帖子。我的答案是编辑。 – recodeFuture 2014-10-22 10:46:12

+0

我找到了解决方案。 all_cnt必须是int32类型! – recodeFuture 2014-10-22 11:26:32

回答

0

的问题是3D阵列内部轮廓的清单必须是Int32类型的。在我的情况下,我不得不将all_cnt定义为all_cnt.astype(np.int32)。

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