Как преобразовать многомерный список в numpy.array, чтобы он поместился в cv2.fillConvexPoly - PullRequest
0 голосов
/ 03 мая 2019

У меня словарь '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 для «маскирования»

Поскольку 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 голосов
/ 05 мая 2019

Вы уверены, что два списка имеют одинаковый размер?Потому что, если они есть, 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])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...