我有一个字典'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])]