图像透视变化,坐标的计算



```python
def order_points(pts):
    # 一共4个坐标点
    rect = np.zeros((4, 2), dtype = "float32")

    # 按顺序找到对应坐标0123分别是 左上,右上,右下,左下
    # 计算左上,右下
    s = pts.sum(axis = 1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]

    # 计算右上和左下
    diff = np.diff(pts, axis = 1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]

    return rect

不太理解为什么四个坐标点计算出来的原理,为什么,虽然是视频哩说的对应位置是这样
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/734860523196175.png "#left"),确实不能理解求最小和对应的坐标索引是左上角,其他的也类似

【以下回答由 GPT 生成】

这段代码使用了一种常见的方法,称为"轮廓顶点排序",用于将给定的四个点按照特定的顺序进行排序,以便进行透视变换。下面我将详细解释这个计算方法的原理。

def order_points(pts):
    rect = np.zeros((4, 2), dtype="float32")

    # 计算左上和右下
    s = pts.sum(axis=1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]

    # 计算右上和左下
    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]

    return rect
  1. 首先,我们创建一个2x4的全零矩阵rect,用于存储排好序的四个点的坐标。

  2. 然后,我们进行第一次排序,找到左上角和右下角的坐标。通过将四个点的x坐标和y坐标分别相加,我们可以得到一个包含四个值的数组s。然后,通过np.argmin(s)np.argmax(s)找到最小值和最大值对应的索引,分别表示左上角和右下角的点。将这两个点的坐标存储在rect的第一行和第三行。

  3. 接下来,我们进行第二次排序,找到右上角和左下角的坐标。通过计算四个点的x坐标的差异,可以得到一个包含三个值的数组diff。然后,通过np.argmin(diff)np.argmax(diff)找到最小值和最大值对应的索引,分别表示右上角和左下角的点。将这两个点的坐标存储在rect的第二行和第四行。

  4. 最后,将排好序的四个点的坐标rect返回。

这个方法的原理是基于以下观察:

  • 左上角和右下角的点在x和y坐标之和最小和最大的点,因为左上角的点的x和y坐标之和最小,右下角的点的x和y坐标之和最大。
  • 右上角和左下角的点在x坐标之差最小和最大的点,因为右上角的点的x坐标之差最小,左下角的点的x坐标之差最大。

通过这种方式,可以保证得到排好序的四个点,以便进行透视变换。

希望这个解释对你有帮助。如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^