【问题标题】:Why does the HoughLinesP output a 3D array, instead of a 2D array?为什么 HoughLinesP 输出的是 3D 数组,而不是 2D 数组?
【发布时间】:2016-11-01 15:12:29
【问题描述】:

我在图像上使用函数(Python、Numpy、OpenCV3),这是我的示例输出 -

[[[539 340 897 538]]

 [[533 340 877 538]]

 [[280 460 346 410]]

 [[292 462 353 411]]

 [[540 343 798 492]]]

它的大小是(5,1,4)

我试图了解函数会在什么情况下输出 (5,2,4) 或 (5,3,4) 之类的内容。但我想不出我现在使用过的任何图像,它是一个列数为 1 的 3D 数组。

难道只有一个二维数组就足够了,而且可能更有效吗?

【问题讨论】:

  • 因为在 openCV 中,前两个维度是矩阵,第三个维度是元素的维度。所以通常 openCV 中的所有 1D 输出都是 Nx1 2D 矩阵。元素类型的另一个维度(例如,1d 用于灰度像素值或浮点距离值,2D 用于点坐标,3D 用于 rgb 值,4D 用于点对或 rgba 值等)所以 Nx1 部分是因为优化图像,它们是每个元素中具有 mD 像素的 2D 矩阵。

标签: python-3.x opencv numpy hough-transform opencv3.1


【解决方案1】:

我在 OpenCV Q&A 上提问并得到以下回复 -

opencv 是一个 c++ 库,python 包装器是自动生成的 来自一些脚本,所以在 c++ 中我们有:

矢量线;保存霍夫结果。

现在不幸的是, Vec4i 是 Matx 的后代,它实际上是 一个二维的东西,所以在 python 中你得到:

[ #one 为向量

[ #one 表示 Vec4i 的第一个暗淡(1,漂亮 毫无用处,诚然:)

[ #one 表示 Vec4i 的第二个暗淡(4 个元素)

再次,我认为,你只需要忍受它。

【讨论】:

    【解决方案2】:

    如果你不想要额外的维度,因为它是 1,只需使用挤压

    >>> a = np.arange(5*4).reshape(5,1,4)
    >>> a
    array([[[ 0,  1,  2,  3]],
    
           [[ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11]],
    
           [[12, 13, 14, 15]],
    
           [[16, 17, 18, 19]]])
    >>> a.squeeze()
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19]])
    

    有时额外的轴会派上用场

    a.swapaxes(1,2)
    array([[[ 0],
            [ 1],
            [ 2],
            [ 3]],
         ... Snip
           [[16],
            [17],
            [18],
            [19]]])
    

    鉴于更新并假设需要第一个,假设不需要额外的维度,这些中的任何一个都会返回相同的结果。

    >>> a[0].squeeze()
    array([0, 1, 2, 3])
    >>> a.squeeze()[0]
    array([0, 1, 2, 3])
    

    【讨论】:

    • 谢谢。这很有帮助。但我仍然想知道为什么它是 3D 开始的。关于为什么根本没有实现输出二维数组的任何想法?
    • 我不知道它具体是做什么的,但是我之前在输出额外维度 1 时遇到过这个问题,例如 (1,5,4)
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-11-20
    • 2017-12-21
    相关资源
    最近更新 更多