如何在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:手动实现单应性变换(理解原理)
单应性变换基于齐次坐标矩阵乘法,步骤如下:
- 将每个2D点
(x,y)转换为齐次坐标(x,y,1) - 用H矩阵与该齐次坐标相乘,得到变换后的齐次结果
- 将结果除以第三个分量(齐次项),得到最终的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
相关产品推荐
相关产品推荐

