You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中把单应性矩阵H应用于坐标列表?

如何用Python将单应性矩阵应用于坐标列表?

我已通过匹配两张图像中的坐标得到单应性矩阵H:

import numpy as np

H = np.array([
    [9.62122460e-02, 4.19126557e-01, 2.78378319e+02],
    [2.84972076e-02, 1.04148707e+00, -2.60554265e+01],
    [-7.03233591e-05, 2.00171167e-03, 1.00000000e+00]
])

需要将该矩阵应用到以下x、y坐标列表:

x = [336.0, 21.0, 874.0, 407.0, 671.0, 587.0, 153.5, 1030.5, 1032.5, 663.5, 793.5]
y = [179.0, 205.0, 166.0, 148.0, 300.0, 93.0, 185.0, 214.0, 312.0, 182.0, 402.0]

实现方法

方法1:手动实现单应性变换(理解原理)

单应性变换基于齐次坐标矩阵乘法,步骤如下:

  1. 将每个2D点(x,y)转换为齐次坐标(x,y,1)
  2. 用H矩阵与该齐次坐标相乘,得到变换后的齐次结果
  3. 将结果除以第三个分量(齐次项),得到最终的2D坐标(x', y')

代码实现:

import numpy as np

# 定义单应性矩阵H
H = np.array([
    [9.62122460e-02, 4.19126557e-01, 2.78378319e+02],
    [2.84972076e-02, 1.04148707e+00, -2.60554265e+01],
    [-7.03233591e-05, 2.00171167e-03, 1.00000000e+00]
])

# 原始坐标
x = [336.0, 21.0, 874.0, 407.0, 671.0, 587.0, 153.5, 1030.5, 1032.5, 663.5, 793.5]
y = [179.0, 205.0, 166.0, 148.0, 300.0, 93.0, 185.0, 214.0, 312.0, 182.0, 402.0]

# 将坐标转换为齐次矩阵:形状为(3, N)
points_homogeneous = np.vstack((x, y, np.ones(len(x))))

# 应用单应性变换
transformed_homogeneous = H @ points_homogeneous

# 转换回2D坐标:除以齐次项
x_transformed = transformed_homogeneous[0] / transformed_homogeneous[2]
y_transformed = transformed_homogeneous[1] / transformed_homogeneous[2]

# 输出结果
print("变换后的x坐标:", x_transformed)
print("变换后的y坐标:", y_transformed)

方法2:使用OpenCV快速实现(推荐)

OpenCV提供了cv2.perspectiveTransform函数,可以直接批量处理坐标变换,无需手动实现矩阵运算:

代码实现:

import numpy as np
import cv2

# 定义单应性矩阵H
H = np.array([
    [9.62122460e-02, 4.19126557e-01, 2.78378319e+02],
    [2.84972076e-02, 1.04148707e+00, -2.60554265e+01],
    [-7.03233591e-05, 2.00171167e-03, 1.00000000e+00]
])

# 原始坐标:转换为OpenCV要求的形状(N, 1, 2)
x = [336.0, 21.0, 874.0, 407.0, 671.0, 587.0, 153.5, 1030.5, 1032.5, 663.5, 793.5]
y = [179.0, 205.0, 166.0, 148.0, 300.0, 93.0, 185.0, 214.0, 312.0, 182.0, 402.0]
points = np.array(list(zip(x, y)), dtype=np.float32).reshape(-1, 1, 2)

# 应用单应性变换
transformed_points = cv2.perspectiveTransform(points, H)

# 提取变换后的坐标
x_transformed = transformed_points[:, 0, 0]
y_transformed = transformed_points[:, 0, 1]

# 输出结果
print("变换后的x坐标:", x_transformed)
print("变换后的y坐标:", y_transformed)

内容的提问来源于stack exchange,提问作者J33T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:36:26