2

このペーパー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 つの次元しかありませんでした。

ここで私が間違っていることを誰かが知っていますか? 私はプログラミングにかなり慣れていないので、これがばかげている場合は安心してください。これを読んだすべての人に感謝します。これ以上情報を提供できるかどうか教えてください。

4

1 に答える 1

1

多次元変数を最適化する方法がわからないようです。これleastsqは簡単に回避できる問題です。

def e2(P, M, m) :
    return np.sqrt(np.sum((m.T - np.dot(P.reshape(3,4), M.T))**2, axis=0))

P = P.reshape((12,))

P_new, success = leastsq(e2, P, args=(M, m))

これは実行されますが、作成したランダム データでは収束に問題があります。基本的な考え方は、行列Pを 12 項目の長さのベクトルとして扱い、変換が必要なときに関数内で形状を変更するMことmです。

eまた、関数をよりnumpythonicな方法で自由に書き直しました...

于 2013-01-12T07:05:30.640 に答える