【问题标题】:HoughCircles OpenCV return ndarray into array in pythonHoughCircles OpenCV将ndarray返回到python中的数组
【发布时间】:2019-10-26 11:16:44
【问题描述】:

从 opencv 中的 houghcircles,我得到一个返回的数组。这是一个只有一列的二维数组,除了我返回的是一个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]]

我尝试过对数组使用 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]]

【问题讨论】:

  • 我做的大多数排序也倾向于只对每个数组本身的项目进行排序

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


【解决方案1】:

您的 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]])

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

【讨论】:

  • 抱歉,我没说清楚。列表部分是正确的谢谢!但是,当我使用 argsort 时,我收到此错误:Traceback(最近一次调用最后一次):文件“C:\Users\joeyz\Downloads\New folder\Eye.py”,第 12 行,在 sc = circles [idx,:] IndexError: index 2 is out of bounds for axis 0 with size 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多