首页 > 解决方案 > 在什么情况下需要像 python-opencv 中的 reshape(-1,1,2) 一样重塑点?

问题描述

我是 python-opencv 的新手,所以我阅读了本教程并找到了一些示例代码,如下所示:

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))

它将向您展示如何使用 cv2.polylines 函数绘制多边形,其中大多数都很容易理解,我很好奇的是:

pts = pts.reshape((-1,1,2)) #I understand this makes pts.shape to be (4,1,2)

我尝试删除此代码并发现没有任何区别,它也可以正常工作。在这个reshape操作之前,pts的形状是(4,2),对我来说已经够直观了。此外,当我编写这样的代码时:

convex_pts = cv2.convexHull(pts) #get a convexhull from pts,pts's shape is(4,2)
print(convex_pts)       #[[[72,20]],[[20,30]],[[10,5]],[[50,10]]]
print(convex_pts.shape) #(4,1,2)

在我看来,python-opencv 坚持“解压”它并使其具有类似(x,1,2)的形状,这对我来说很奇怪,因为当形状为(x,2)时它在教程案例中工作正常.任何理由为什么这是必要的?我四处寻找,没有发现任何有用的东西,我错过了什么吗?所以我想知道为什么以及在什么情况下需要像这样重塑?

标签: pythonnumpyopencv

解决方案


如果您调试第一行代码:

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)

然后使用pts.shape,你会得到(4, 2),这意味着pts此时有 4 行和 2 列。现在,采用此矩阵的函数可能期望以其他格式输入,在您的情况下似乎是(4, 1, 2),这意味着 4 行、1 列和每个元素具有 2 个子元素。要将形状转换为(4, 2)形状(4, 1, 2),我们使用以下代码行:

pts = pts.reshape((-1,1,2))

上面这行的意思是,我需要一个行数未知但只有一列且每个元素有 2 个子元素的矩阵。现在 numpy 在内部计算未知的大小并自动为您创建一个矩阵。这只是一种花哨的做事方式pts.reshape((4,1,2))

还引用文档

一个形状维度可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的。


推荐阅读