2014-10-22 78 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個對象的邊界點。