このペーパーhttp://cronos.rutgers.edu/~meer/TEACHTOO/PAPERS/zhang.pdf (セクション 2.3) を使用して説明されているように、2D から 3D ポイントへの対応に基づいて、カメラの 3x3 キャリブレーション行列 P を計算しようとしています。パイソン2.7。P の初期推定値を見つけることができましたが、レーベンバーグ・マルカート アルゴリズム (2.3.4) を使用してそれを改良する必要があります。これは scipy.optimize.minpack.leastsq で実行できるようです。ただし、この機能を実装する試みは失敗しました。ここに私が持っているものの簡略化されたバージョンがあります(Mは(x、y、z、1)の形式の均質化された3dポイントのnumpy配列で、(18,4)の形状で、mは均質化された2dポイントのnumpy配列です(u,v,1) の形式で (18,3)) の形状:
import numpy as N
from scipy.optimize.minpack import leastsq
def e(P,M,m):
a = P.dot(M.T)
print a.shape
b = m.T-a
b1 = b[0]
b2 = b[1]
b3 = b[2]
dist = sqrt((b1**2)+(b2**2)+(b3**2))
return dist
P = N.array( [ [4.66135353e+01,1.24341518e+02,-9.07923056e+00,9.59292826e+02],
[-3.60062368e+01,3.56319152e+01,1.14245572e+02,2.32061401e-02],
[-4.04188199e-02,4.00793699e-02,-9.48804649e-03,1.00000e+00] ] )
m = []
M = []
#define m list and M list
for i in range(0,len(uv)):
uv[i].append(1) #uv is unhomogenized uv coordinate list (source left out to simplify)
xyz[i].append(1) #xyz is unhomogenized xyz coordinate list (source left out to simplify)
m.append(N.array( [ [uv[i][0]],[uv[i][1]],[uv[i][2]] ] ))
m = N.array( uv )
M = N.array( xyz )
#the shape of m is (18,3) and the shape of M is (18,4)
P_new, success = leastsq(e, P, args=(M,m))
問題は、ベクトルの配列である M および m 変数にあると思います。scipy.optimize.lstsq 関数の例を見て、それを機能させることができましたが、引数が 1 つの次元しかありませんでした。
ここで私が間違っていることを誰かが知っていますか? 私はプログラミングにかなり慣れていないので、これがばかげている場合は安心してください。これを読んだすべての人に感謝します。これ以上情報を提供できるかどうか教えてください。