【问题标题】:CV2.approxPolyDP Function Returns an N x 1 x 2 Array Rather Than N x 2CV2.approxPolyDP 函数返回一个 N x 1 x 2 数组而不是 N x 2
【发布时间】:2022-01-17 20:46:11
【问题描述】:

我有一个函数可以利用 OpenCV 的轮廓检测在图像中的一些主要特征周围绘制一个多边形。我使用下面 sn-p 中的 approxPolyDP 函数简化了这些轮廓,以在区域周围返回一个封闭的梯形,它工作正常:

top_poly = cv.approxPolyDP(top_cnt, 0.05 * top_perimeter, closed=True)

top_poly = np.squeeze(top_poly) # get rid of the singleton dimension

但是,当根据下面链接的文档的预期输出是 N x 2D 点 (N x 2) 的数组时, approxPolyDP 返回一个奇怪类型的 ndarray,其形状为 N x 1 x 2。我不得不调试一段时间,直到我发现可以在 sn-p 的第二行使用 np.squeeze 雕刻出其中的单例维度。感谢这个答案:What does cv2.approxPolydp() return?

我的问题是,这个单一维度的目的是什么?我担心我可能会丢失一些有用的信息,而且我不喜欢以我不完全理解的方式使用 np.squeeze()。感谢您提供任何可以对此有所启发的意见。

https://docs.opencv.org/4.5.4/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c

【问题讨论】:

  • 它只输出一个点列表:只要你有一个点列表(带有 x 和 y 坐标)就可以了

标签: python opencv computer-vision


【解决方案1】:

结果形状是由于 OpenCV 的要求而发生的,即它必须将 numpy 数组映射到 cv::Mat 并返回。

cv::Mat 是具有 通道 的 2D 事物,可以是颜色(RGB 或其他)、2D 点、3D 点、4D、...或任何其他用途。 p>

形状一般为(height, width, channels)

OpenCV 将点作为 2 通道数据的列向量 (Nx1) 返回,因此是 (N, 1, 2)

OpenCV 在某种程度上可以容忍不同的形状,例如 (N, 2, 1)(N, 2)(N 行,2 列,单通道)。

【讨论】:

  • 现在说得通了——感谢您提供的信息!我担心这可能是一些与操作相关的数据,但我明白你的意思。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2019-02-03
  • 2021-08-05
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多