我的字典“ 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()的方法,因为它看起来有点尴尬和不必要。
谢谢
答案 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])]