HoughCircles OpenCV возвращают ndarray в массив в python - PullRequest
0 голосов
/ 12 июня 2019

Из houghcircles в opencv я получаю возвращенный массив.Это двумерный массив только с одним столбцом, за исключением того, что я возвращаю, это ndarray.Я новичок и учусь openCV.Возвращенный массив отображается странным образом, и я хочу отсортировать его по первому столбцу, а также преобразовать его в обычный двумерный массив.

Array - Не весь массив, потому что его 57 строк, но этого должно быть достаточно.Запятых нигде нет.

Circles = 
[[ 876  566    6]

[ 898  574    6]

 [ 846  710    6]

 [ 850  762    7]

 [ 822  574    6]

 [ 880  620    6]

 [ 894  650    6]

 [ 836  604    6]]

Я пытался использовать отсортированный метод для массивов и метод ndarray.sort.

sorted(circles, key=lambda circles_entry: circles_entry[1])

circles[0].sort(axis=0)

Я использовал эти два метода для попыткиСортировать.Первый возвращает массив с массивом массивов.3D массив?а второй сортирует его со всех позиций.

Примеры первой сортировки -

[array([[ 876,  566,    6],
        [ 898,  574,    6],
        [ 846,  710,    6],
        [ 850,  762,    7],])]

Пример второй сортировки -

[[ 110  542    2]

 [ 332  550    5]

 [ 386  558    5]

 [ 734  566    5]

 [ 744  566    5]

 [ 754  574    5]

 [ 758  574    5]

 [ 762  582    5]

 [ 768  582    5]

 [ 772  588    5]

 [ 778  590    5]]

1 Ответ

0 голосов
/ 12 июня 2019

Ваш circles является двумерным массивом.Отображение без запятых - это обычный str формат такого массива:

In [13]: print(circles)                                                                                
[[876 566   6]
 [898 574   6]
 [846 710   6]
 [850 762   7]
 [822 574   6]
 [880 620   6]
 [894 650   6]
 [836 604   6]]
In [14]: circles.shape                                                                                 
Out[14]: (8, 3)
In [15]: type(circles)                                                                                 
Out[15]: numpy.ndarray
In [16]: print(repr(circles))                                                                          
array([[876, 566,   6],
       [898, 574,   6],
       [846, 710,   6],
       [850, 762,   7],
       [822, 574,   6],
       [880, 620,   6],
       [894, 650,   6],
       [836, 604,   6]])

Я подозреваю, что под «обычным 2d-массивом» вы подразумеваете список списков.По крайней мере, это единственная вещь, похожая на массив, которая является стандартной в Python (если вы не импортируете редко используемый модуль array):

In [18]: print(circles.tolist())                                                                       
[[876, 566, 6], [898, 574, 6], [846, 710, 6], [850, 762, 7], [822, 574, 6], [880, 620, 6], [894, 650, 6], [836, 604, 6]]

Один из способов сортировки по первому столбцу - нам np.argsortполучить индекс:

In [25]: idx = np.argsort(circles[:,0])                                                                
In [26]: idx                                                                                           
Out[26]: array([4, 7, 2, 3, 0, 5, 6, 1])
In [27]: sc = circles[idx,:]                                                                           
In [28]: sc                                                                                            
Out[28]: 
array([[822, 574,   6],
       [836, 604,   6],
       [846, 710,   6],
       [850, 762,   7],
       [876, 566,   6],
       [880, 620,   6],
       [894, 650,   6],
       [898, 574,   6]])

Используя Python sorted:

In [31]: sorted(circles, key=lambda x: x[0])                                                           
Out[31]: 
[array([822, 574,   6]),
 array([836, 604,   6]),
 array([846, 710,   6]),
 array([850, 762,   7]),
 array([876, 566,   6]),
 array([880, 620,   6]),
 array([894, 650,   6]),
 array([898, 574,   6])]

или если мы сначала конвертируем circles во вложенный список:

In [32]: sorted(circles.tolist(), key=lambda x: x[0])                                                  
Out[32]: 
[[822, 574, 6],
 [836, 604, 6],
 [846, 710, 6],
 [850, 762, 7],
 [876, 566, 6],
 [880, 620, 6],
 [894, 650, 6],
 [898, 574, 6]]
...