2014-07-05 75 views
1

我在看起來像這樣一個numpy的矢量數據:如何將包含條目[[[int int]] ...]的向量轉換爲包含python/numpy中的條目[[int int] ...]的向量?

[[[1119 15]] 

[[1125 27]] 

[[1129 43]] 

[[1131 62]] 

[[1131 87]] 

[[1141 234]] 

...] 

這些被認爲是一組我可以使用表示曲線的點的,而是每個點[INT,INT]似乎被封裝在另一個向量中。 I.E .:我有[[1 1]]而不是[1 1]。

這個數據是在給我一個「輪廓」後用opencv函數cv2.approxPolyDP給我的,我需要使用它。我認爲這個函數基本上給了我它認爲是一組曲線的內容,但是這裏的每條曲線只包含一個點[int int],它並不真正有意義。具有一點的曲線不是曲線,而是一個點。

在這種情況下,是否有任何方法將[[int int]]轉換爲[int int]?

+2

您可能正在尋找['np.squeeze'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.squeeze.html)。 – Jaime

回答

3

看這個陣列的形狀。它可能是(n, 1, 2)

reshape它到(n,2)x.reshape(-1,2)是一個方便的快捷方式,爲您節省了確定n的工作。 squeeze也擺脫了奇異的維度。

2

也許這是不是最佳的解決方案,但你可以這樣做:

import numpy as np 

# example 

a = np.array([ [[1119, 15]], [[1125, 27]], [[1129, 43]] ]) 

# convert 

a = np.array([ x[0] for x in a ]) 

print a 

[[1119 15] 
[1125 27] 
[1129 43]] 

編輯:

import numpy as np 

a = np.array([ [[1119, 15]], [[1125, 27]], [[1129, 143]] ]) 

size = len(a) 

a = a.reshape([size,2]) 

print a 

    [[1119 15] 
    [1125 27] 
    [1129 43]] 
0

您可以檢查第二個參數approxPolyDP是否太大。 注意,下面的代碼不會讓小的所有時間:

epsilon = 0.1*arcLength(contour,True) 
polygon = approxPolyDP(contour, epsilon, True) 

當輪廓的邊緣變得嘈雜,由弧長返回輪廓的弧長可以是非常非常大的,其收益率在乘以0.1後仍然是非常大的ε,從而使approxPolyDP將整個輪廓簡化成單個點。