簡體   English   中英

如何在python / numpy中將包含條目[[[int int]]…]的向量轉換為包含條目[[int int]…]的向量?

[英]How can I convert a vector containing entries [[[int int]] …] into a vector containing entries [[int int] …] in python/numpy?

我有一個像這樣的numpy向量中的數據:

 [[[1119   15]]

 [[1125   27]]

 [[1129   43]]

 [[1131   62]]

 [[1131   87]]

 [[1141  234]]

 ...]

這些應該是可以用來代表曲線的一組點,但是每個點[int,int]似乎都封裝在另一個向量內。 IE:我有[[1 1]]而不是[1 1]。

在我給它提供一個“輪廓”之后,這個數據是由opencv函數cv2.approxPolyDP提供給我的,我需要使用它。 我認為該函數基本上給了我它認為是一組曲線的信息,但是這里的每個曲線僅包含一個點[int int],這實際上沒有任何意義。 只有一點的曲線不是曲線,而是一點。

在這種情況下,有什么方法可以將[[int int]]轉換為[int int]?

看一下這個數組的形狀。 可能是(n, 1, 2)

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

可能這不是最佳解決方案,但您可以這樣做:

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]]

您可以檢查roxPolyDP中的第二個參數是否太大。 請注意,以下代碼並不會一直變小:

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

當輪廓的邊緣變得嘈雜時,由arcLength返回的輪廓的弧長可能會非常大,乘以0.1后仍會產生非常大的epsilon,從而使roxPolyDP將整個輪廓簡化為一個點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM