2

カメラ ポーズ [R|t] を推定するための 2 ビュー SFM アプローチの結果を検証するために、キャリブレーションに使用したチェス盤パターンを利用しました。 . したがって、最初の 2 つのパターン間の相対的な姿勢は簡単に計算できるとしましょう。

それでも、正しいカメラ ポーズが得られず、問題を把握するのに非常に苦労しましたが、無駄ではありませんでした。

私の問題を解決するためにあなたの貢献に感謝します。

マイコード説明:

  • 画像の歪みを直す
  • 2 つの画像でチェス盤の角を見つける
  • 一致点 (2 つの画像と線を並べてプロットすることで確認)
  • 基本行列の推定 (検証済み: x'T * F * x = 0)
  • エッセンシャル マトリックス (E) = KT * F * K (検証済み: X'T * E * X = 0)
  • E = U * S * VT の SVD
  • R = U * W * VT または U * WT * VT で、WT = [0,-1,0; 1,0,0; 0,0,1]

    FundMat, mask = cv2.findFundamentalMat(imgpoints1, imgpoints2, cv2.FM_LMEDS)
    
    # is the fundamental matrix is really a fundamental Matrix. xFx'=0 ??
    # verfication of fundamental matrix
    
    for i in range(len(imgpoints1)):
    
        X = np.array([imgpoints1[i][0],imgpoints1[i][1],1])
        X_prime = np.array([imgpoints2[i][0],imgpoints2[i][1],1])
        err = np.dot(np.dot(X_prime.T,FundMat),X)
        if mask[i] == True:
           print(err)
    
    
        # E = [t]R = (K_-T)_-1 * F * K = K_T*F*K
    term1 = np.dot(np.transpose(mtx), FundMat)       # newcameramtx , mtx
    E = np.dot(term1, mtx)                           # newcameramtx , mtx
    
    
         # verfication of Essential matrix
    for i in range(len(imgpoints1)):
    
        X_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints1[i][0],imgpoints1[i][1],1]).T)
        X_prime_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints2[i][0],imgpoints2[i][1],1]).T)
        err_Ess = np.dot(np.dot(X_prime_norm.T,E),X_norm)
        if mask[i] == True:
            print(err_Ess)
    
    # SVD of E 
    U,S,V_T = np.linalg.svd(E)
    
    # computation of Rotation and Translation without enforcement 
    W = np.array([[0,-1,0],[1,0,0],[0,0,1]])
    
    
    Rot1 = np.dot(np.dot(U, W), V_T)  
    
    Rot2 = np.dot(np.dot(U, W.T), V_T)
    
4

1 に答える 1

0

あなたの問題は、チェス盤の点を使用していることです。共平面点から基礎行列を推定することはできません。これを修正する 1 つの方法は、SIFT や SURF などの一般的なアプローチを使用してシーン ポイントを一致させることです。もう 1 つの方法は、5 ポイント アルゴリズムを使用してエッセンシャル マトリックスを直接推定することです。

また、Essential マトリックスからスケールまでのカメラ ポーズしか計算できないことに注意してください。つまり、翻訳は単位ベクトルになります。変換の実際の長さを取得するための倍率を計算する 1 つの方法は、チェス盤を使用することです。

于 2016-07-27T14:24:14.457 に答える