如果你想要一個通用的解決方案,你可以使用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已經指出的,沒有足夠的方程爲一個獨特的方案。由於矢量KTM
和m
的最後一行是1,所以對於十二個變量只有兩個等式。
如果您有多個pixelsto評估,即多對(m, M)
,您可以使用Numpy's Least Squares Solver找到解決方案。
你公式中的K.T.M'是什麼?斑點的產品? – Monkpit
你只有三個方程和十二個未知數,所以沒有獨特的功能。我懷疑你的變換矩陣中的'x_ij'條目應該是一個旋轉,這會使你下降到六個未知數,仍然太多。 –
是的,我知道我有12個變量只有3個方程,但如果我把我的模式的其他點,所以像M(1,1,0),我得到3個新聞方程。我的問題是在矩陣中引入沒有值的變量。但我認爲@Dietrich已經解決了我的問題,我會測試一下。 – Golgii