如何将多维列表转换为numpy.Array,以适合Cv2.fillConvexpoly



我有一个字典'roi'如下,

{  
10: [],  
11: [[[315.0, 193.0],
   ... ...
   [315.0, 193.0]]],  
12: [[[317.0, 195.0],
   ... ...
   [317.0, 195.0]],
  [[318.0, 320.0],
   ... ...
   [318.0, 320.0]]],  
13: [[[307.0, 148.0],
   ... ...
   [307.0, 148.0]],
  [[311.0, 323.0],
   ... ...
   [311.0, 323.0]]],  
14: [[[306.0, 170.0],
    ... ...
   [306.0, 170.0]],
  [[322.0, 302.0],
   ... ...
   [322.0, 302.0]]],  
15: [[[303.0, 167.0],
   ... ...
   [303.0, 167.0]]],  
16: [[[301.0, 168.0],
   ... ...
   [301.0, 168.0]]],  
17: [[[302.0, 175.0],
   ... ...
   [302.0, 175.0]]],  
18: [[[299.0, 190.0],
   ... ...
   [299.0, 190.0]]]}  
}  

我要做的是将dict中的列表用作点集,然后将cv2.fillconvexpoly应用于'mask'

由于cv2.fillconvexpoly要求输入点集为numpy.array,我尝试使用np.array((尝试转换整个内容。

for k in roi.keys():
    point_sets = np.array(roi[k])
    for p in range(point_sets.shape[0]):
        print(type(point_sets[p]))
#       cv2.fillConvexPoly(mask[k], point_set, 1)

,结果是

<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'numpy.ndarray'>

在我看来,由于与密钥12、13和14相对应的列表恰好包含2个列表,因此首先无法将内部的2个列表转换为np.array。结果,我通过确定每个人的np.array类型转换来解决这个问题。

 point_sets = np.array(roi[k])
 for p in range(point_sets.shape[0]):
     point_set = np.int32([np.array(point_sets[p])])
     cv2.fillConvexPoly(mask[k], point_set, 1) 

现在,我期望有一些方法可以在不做NP.Array((两次的情况下进行此操作,因为它看起来有些尴尬和不必要。
谢谢

您确定这两个列表的大小相同吗?因为如果是,则np.array应该能够将列表列表转换为一个巨大的numpy数组。但是,如果不是,那么就不可能将单个数组从它们中删除,而Numpy会将它们转换为一个numpy对象,而对象是两个列表。说明:

In [1]: import numpy as np
In [2]: np.array([[1,2,3],[4,5,6]])
Out[2]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [3]: np.array([[1,2,3],[4,5,6,7]])
Out[3]: array([list([1, 2, 3]), list([4, 5, 6, 7])], dtype=object)

如果这是您的代码失败的原因,则可能需要将列表列表转换为numpy数组的列表,而不是整个numpy数组,以避免问题:

In [4]: [ np.array(x) for x in [[1,2,3],[4,5,6,7]] ]
Out[4]: [array([1, 2, 3]), array([4, 5, 6, 7])]

最新更新