python - 如何在Python中求解带有矩阵变量的方程?

标签 python numpy matrix

我正在 Pyhon 中编码,并且正在研究立体相关。我想解这个方程:m = K.T.M

m、K、M 已知。

哪里:

M是笛卡尔坐标系“世界”中点的齐次坐标

M=np.array([X,Y,Z,1])

K 是我左摄像头的内在矩阵

K=np.matrix([ [fx,  0, cx, 0],
              [ 0, fy, cy, 0], 
              [ 0,  0,  1, 0]])

m是左摄像头的M点 View

m=np.array([x,y,1])

T是传递到“世界”坐标系到左相机坐标系的变换。

T= np.matrix([[x00, x01, x02, Tx],
              [x10, x11, x12, Ty], 
              [x20, x21, x22, Tz], 
              [0  , 0  , 0  , 1 ]])

所以我想解这个方程来找到T,但是如果不给变量赋值就不可能创建一个矩阵。

有人有解决办法吗?

谢谢 最好的问候

最佳答案

如果您想要通用解决方案,可以使用Sympy ,它允许您使用符号表达。在以下代码中,表达式 K.T.M = m 被重新表述为标准线性方程 HH.xx = mm,其中 xx 是向量,其中从 T 中提取的未知数:

from IPython.display import display
import sympy as sy

sy.init_printing()  # LaTeX like pretty printing for IPython

# declaring symbolic variables:
x, y, X, Y, Z, fx, fy, cx, cy = sy.symbols("x y X Y Z f_x f_y c_x c_y", real=True)
x00, x01, x02, x10, x11 = sy.symbols("x00, x01, x02, x10, x11", real=True)
x12, x20, x21, x22 = sy.symbols("x12, x20, x21, x22", real=True)
Tx, Ty, Tz = sy.symbols(" T_x T_y T_z", real=True)

# Building matrices and vectors:
M = sy.Matrix([X, Y, Z, 1])
m = sy.Matrix([x, y, 1])
K = sy.Matrix([[fx,  0, cx, 0],
               [0,  fy, cy, 0],
               [0,   0,  0, 1]])
T = sy.Matrix([[x00, x01, x02, Tx],
               [x10, x11, x12, Ty],
               [x20, x21, x22, Tz],
               [0,     0,   0,  1]])

print("KTM = K.T.M = ")
KTM = sy.simplify(K*T*M)
display(KTM)

print("Vector of Unkowns xx.T = ")
xx = sy.Matrix(list(T.atoms(sy.Symbol)))
display(xx.T)
print("For equation HH.xx = mm, HH = ")
HH = KTM[:2, :].jacobian(xx)  # calculate the derivative for each unknown
display(HH)

正如 @Sven-Marnach 已经指出的那样,没有足够的方程来实现唯一的解决方案。由于向量 KTMm 的最后一行为 1,因此十二个变量只有两个方程。

如果您有多个像素要评估,即多对 (m, M),您可以使用 Numpy's Least Squares Solver寻找解决方案。

关于python - 如何在Python中求解带有矩阵变量的方程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35204155/

相关文章:

Python 导入 matplotlib.pyplot 不起作用

python - 用python计算二项式分布概率矩阵

python - 如何在kivy中获取AnchorLayout child 的高度?

python - 对象对于所需数组来说太深 - scipy.integrate.odeint

opencv - 如何将 Mat 转换为 dlib 的矩阵

python - 如何按连接数对查询进行排序

python - 加快滑动窗口平均计算

python - numba 编译函数中范围函数的行为

java - java中Integer[][](矩阵)的Arraylist

java - 在java中生成一个带有0's and 1'的矩阵,同时选择概率