HoughCircles OpenCV将ndarray返回到python中的数组

时间:2019-06-12 02:09:03

标签: python numpy opencv multidimensional-array numpy-ndarray

从opencv的houghcircles中,我得到了一个数组。这是一个只有一列的2d数组,除了我返回的是ndarray。我是新手,正在学习openCV。返回的数组显示异常,我想按第一列对其进行排序,然后将其秘密转换为常规2d数组。

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]]

我尝试过使用数组的sorted方法和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 :(得分:0)

您的circles是一个二维numpy数组。没有逗号的显示是这种数组的常规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]]