如何将多维列表转换为numpy.array以适合cv2.fillConvexPoly

时间:2019-05-03 11:39:12

标签: python-3.x numpy opencv

我的字典“ 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]]]}  
}  

我想做的是使用字典中的列表作为点集,并将cv2.fillConvexPoly应用于“遮罩”

由于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()的方法,因为它看起来有点尴尬和不必要。
谢谢

1 个答案:

答案 0 :(得分:0)

您确定两个列表的大小相同吗?因为如果是这样,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])]