如何将包含条目[[[int int]] ...]的向量转换为包含python / numpy中的条目[[int int] ...]的向量?

时间:2014-07-05 00:28:36

标签: python opencv numpy

我在numpy向量中有数据,如下所示:

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

3 个答案:

答案 0 :(得分:3)

看看这个数组的形状。它可能是(n, 1, 2)

reshape它到(n,2)x.reshape(-1,2)是一个方便的快捷方式,为您节省了确定n的工作。 squeeze也可以摆脱单一维度。

答案 1 :(得分: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]]

答案 2 :(得分:0)

您可以检查 approxPolyDP 中的第二个参数是否太大。 请注意,以下代码不会一直变小:

input {
    background-color: #FFF;
}

input[type=password]:focus,
input[type=text]:focus,
input[type=email]:focus {
    background-color: #f1f1f1;
}

当轮廓边缘变得嘈杂时,由 arcLength 返回的轮廓的弧长可能非常大,在乘以0.1后产生仍然非常大的epsilon因此使 approxPolyDP 将整个轮廓简化为一个单点。