我有轮廓线(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)
答案 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个对象的边界点。