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

Python仿射变换坐标转换输出M矩阵为零问题排查求助

仿射变换零矩阵问题修复方案

问题原因

你所有控制点input_sys、output_sys以及待转换点的Z轴值都固定为0,属于共面共Z值的点集,你用于计算行列式的矩阵为奇异矩阵,行列式恒为0,最终输出的M矩阵自然全为0。
你当前的需求是2D平面上的仿射变换,完全不需要引入Z轴维度,3个不共线的2D控制点即可解出2D仿射变换的全部6个参数,你手头的4个控制点已经满足求解要求,降维处理即可。

修复要点

  • 移除所有点冗余的Z轴维度,统一使用2D坐标计算
  • 替换自定义行列式求解逻辑,用numpy内置的最小二乘方法求解参数,避免数值稳定性问题
  • 原代码中导入json、math以及读取labels3.txt的逻辑后续未使用,不需要的话可以直接删除,避免文件读取报错

修改后可运行代码

import numpy as np

# 带地理参考的地平面图像2D坐标
input_sys = np.array([[0,0],[0,23133],[35093,23133],[35093,0]])
# 斜距2D坐标
output_sys = np.array([[0,0],[0,16384],[16384,16384],[16384,0]])
# 待转换的2D坐标点
p = np.array([7954,9338])

# 构造线性方程组求解仿射变换参数
point_count = len(input_sys)
# 自变量矩阵:每个点拼接1列常数项1
X = np.hstack([input_sys, np.ones((point_count, 1))])
Y = output_sys
# 最小二乘求解适配冗余控制点输入
params, _, _, _ = np.linalg.lstsq(X, Y, rcond=None)
# 拆分得到变换矩阵A和平移向量t
A = params[:2, :].T
t = params[2, :]

# 输出变换参数
print("Affine transformation matrix:\n", A)
print("Affine transformation translation vector:\n", t)

# 测试控制点映射精度
print("\nTesting:")
for p_test, P_test in zip(input_sys, output_sys):
    image_p = np.dot(A, p_test) + t
    result = "[OK]" if np.allclose(image_p, P_test, atol=1e-3) else "[ERROR]"
    print(p_test, " mapped to: ", image_p, " ; expected: ", P_test, result)

# 转换目标点
P = np.dot(A, p) + t
print('\nTarget point conversion result:')
print(p, 'mapped to:', P)

运行说明

运行后得到的变换矩阵为预期的缩放矩阵,X轴缩放比例为16384/35093 ≈ 0.467,Y轴缩放比例为16384/23133 ≈ 0.708,平移向量为全0,完全符合控制点的对应关系,不会再出现零矩阵问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:02