2016-02-04 110 views
2

我在Pyhon編碼,我正在研究立體相關。我想解決這個方程:m = K.T.M如何用Python中的矩陣變量求解方程?

m,K,M都知道。

其中:

中號是座標系中的笛卡爾點的齊次座標「世界」

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

ķ是我的左攝像機

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

m it S按左照相機

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

Ť M點的觀點是要傳遞給「世界」的變換座標系到左照相機座標系。

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

所以我想解決這個方程找到牛逼,但它不可能創建一個不變量給出值的矩陣。

有人有解決方案嗎?

感謝 問候

+0

你公式中的K.T.M'是什麼?斑點的產品? – Monkpit

+3

你只有三個方程和十二個未知數,所以沒有獨特的功能。我懷疑你的變換矩陣中的'x_ij'條目應該是一個旋轉,這會使你下降到六個未知數,仍然太多。 –

+0

是的,我知道我有12個變量只有3個方程,但如果我把我的模式的其他點,所以像M(1,1,0),我得到3個新聞方程。我的問題是在矩陣中引入沒有值的變量。但我認爲@Dietrich已經解決了我的問題,我會測試一下。 – Golgii

回答

2

如果你想要一個通用的解決方案,你可以使用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) 

作爲@斯文Marnach已經指出的,沒有足夠的方程爲一個獨特的方案。由於矢量KTMm的最後一行是1,所以對於十二個變量只有兩個等式。

如果您有多個pixelsto評估,即多對(m, M),您可以使用Numpy's Least Squares Solver找到解決方案。

+0

是的,我的模式由45個點組成,所以我有很多(m,M)對,所以更多的方程而不是變量。@Dietrich非常感謝您的回答和您的幫助。我會嘗試並回到你身邊。 – Golgii