houghcirles OpenCV在python中将ndarray返回到数组中

2024-05-16 20:32:33 发布

您现在位置:Python中文网/ 问答频道 /正文

从opencv中的houghcirles,我得到一个返回的数组。它是一个只有一列的2d数组,除了返回的是ndarray。我是新来的,正在学习openCV。返回的数组显示得很奇怪,我想按第一列对它进行排序,并将其转换为常规的二维数组。你知道吗

数组-不是所有的数组,因为它有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.排序方法。你知道吗

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

Tags: 方法示例排序地方数组opencv常规sorted
1条回答
网友
1楼 · 发布于 2024-05-16 20:32:33

您的circles是一个2d 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]])

我怀疑“常规二维数组”是指一系列的列表。至少这是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]]

相关问题 更多 >