CV2.approxPolyDP 函数 Returns 一个 N x 1 x 2 数组而不是 N x 2
CV2.approxPolyDP Function Returns an N x 1 x 2 Array Rather Than N x 2
我有一个函数可以利用 OpenCV 的轮廓检测在图像中的一些主要特征周围绘制多边形。我使用下面代码片段中的 approxPolyDP 函数将这些轮廓简化为 return 区域周围的闭合梯形,并且效果很好:
top_poly = cv.approxPolyDP(top_cnt, 0.05 * top_perimeter, closed=True)
top_poly = np.squeeze(top_poly) # get rid of the singleton dimension
然而,approxPolyDP return 是一种奇怪的 ndarray 类型,其形状为 N x 1 x 2,根据下面链接的文档,预期输出是 N x 2D 点的数组(N x 2).我不得不调试了一段时间,直到我发现可以使用代码片段第二行中的 np.squeeze 来分割其中的单例维度。感谢这个答案:
我的问题是,这个单例维度的目的是什么?我担心我可能会丢失一些有用的信息,而且我不喜欢以我不完全理解的方式使用 np.squeeze()。感谢任何可以对此有所启发的意见。
https://docs.opencv.org/4.5.4/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c
结果形状的发生是因为 OpenCV 的要求,即它必须将 numpy 数组映射到 cv::Mat
并返回。
A cv::Mat
是具有 通道 的 2D 事物,它可以是颜色(RGB 或其他)、2D 点、3D 点、4D,...,或任何其他目的。
形状一般是(height, width, channels)
.
OpenCV returns 点作为 2 通道数据的列向量 (Nx1),因此 (N, 1, 2)
。
OpenCV 在某种程度上容忍不同的形状,例如 (N, 2, 1)
(N, 2)
(N 行,2 列,单通道)。
我有一个函数可以利用 OpenCV 的轮廓检测在图像中的一些主要特征周围绘制多边形。我使用下面代码片段中的 approxPolyDP 函数将这些轮廓简化为 return 区域周围的闭合梯形,并且效果很好:
top_poly = cv.approxPolyDP(top_cnt, 0.05 * top_perimeter, closed=True)
top_poly = np.squeeze(top_poly) # get rid of the singleton dimension
然而,approxPolyDP return 是一种奇怪的 ndarray 类型,其形状为 N x 1 x 2,根据下面链接的文档,预期输出是 N x 2D 点的数组(N x 2).我不得不调试了一段时间,直到我发现可以使用代码片段第二行中的 np.squeeze 来分割其中的单例维度。感谢这个答案:
我的问题是,这个单例维度的目的是什么?我担心我可能会丢失一些有用的信息,而且我不喜欢以我不完全理解的方式使用 np.squeeze()。感谢任何可以对此有所启发的意见。
https://docs.opencv.org/4.5.4/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c
结果形状的发生是因为 OpenCV 的要求,即它必须将 numpy 数组映射到 cv::Mat
并返回。
A cv::Mat
是具有 通道 的 2D 事物,它可以是颜色(RGB 或其他)、2D 点、3D 点、4D,...,或任何其他目的。
形状一般是(height, width, channels)
.
OpenCV returns 点作为 2 通道数据的列向量 (Nx1),因此 (N, 1, 2)
。
OpenCV 在某种程度上容忍不同的形状,例如 (N, 2, 1)
(N, 2)
(N 行,2 列,单通道)。