python - 在什么情况下需要像 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)时它在教程案例中工作正常.任何理由为什么这是必要的?我四处寻找,没有发现任何有用的东西,我错过了什么吗?所以我想知道为什么以及在什么情况下需要像这样重塑?
解决方案
如果您调试第一行代码:
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。在这种情况下,该值是从数组的长度和剩余维度推断出来的。
推荐阅读
- vba - Excel VBA:尝试遍历列时运行时错误“13”类型不匹配
- python - 编写python程序创建列表并将第一个元素的数据类型转换为整数
- python - Tensorflow 输入函数返回无效值(Tensor 代替 Tensor dict)
- node.js - 无法获取 sequlize 模型
- algorithm - n种产品类型的定期排序
- c++ - 在 C++ 中更改整个结构的字节顺序
- mongodb - Parse ID 是确定性的吗?
- android - 我正在我的应用程序上集成 Instamojo,错误
- c# - 是否可以使用 xamarin.form 在我的应用程序中打开另一个应用程序?
- ruby-on-rails - 这是一个很好的急切加载优化吗?