创建轮廓列表
我有一些点(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] ], ... ]。每个数组里包含的是一个物体的边界点。