2012-04-17 14 views
3

私はOpenCV(pythonインターフェイス)でステレオカメラのキャリブレーションを試みます。私は最初calibrateCamera2と別々に二つのカメラを較正した後、私は(OpenCVの書籍に記載されているように)エピポーラ制約と結果を確認OpenCV(python)基本と基本行列が一致しない

cv.StereoCalibrate(object_points, image_points_left, image_points_right, \ 
       point_counts, intrinsic_left, distortion_left,\ 
       intrinsic_right, distortion_right, \ 
       (IMGRES_X,IMGRES_Y), R, T, E, F, \ 
       term_crit=(cv.CV_TERMCRIT_ITER+cv.CV_TERMCRIT_EPS, 100, 1e-8),\ 
       flags=cv.CV_CALIB_FIX_INTRINSIC) 

をstereoCalibrateと周り0.0039の平均エラーを取得するためのパラメータを供給しました。

基本的には、基本マトリックスと必須マトリックスをカメラマトリックスと関連付けることができます。それでは、私が行うことは次のとおりです。

Mr = asarray(intrinsic_right,dtype=float64) 
Ml = asarray(intrinsic_left,dtype=float64) 
E = asarray(E) 
F = asarray(F) 
F2 = dot(dot(inv(Mr).T,E),inv(Ml)) 

しかし、F2は全くF.に似ていない結果の行列は、私が間違ってやっていることは明らかに何かありますか?ヘルプは非常に感謝しています。

編集:ドットとinvはnumpyからです。

答えて

4

StereoCalibrate()によって返されたE行列とF行列は正しいです。 Fはスケールに合わせて定義されています。したがって、返されたFとEから計算されたF行列を比較する場合は、それらを正規化して両方が同じスケールにあることを確認する必要があります。だからあなたがそれらを見るとき、彼らは同じように見える。 StereoCalibrate()は返されたFを正規化します。したがって、コメントの1つに記載されているように、計算されたF2を正規化する必要があります。なぜそうする必要があるのか​​がより明確になることを願っています。

+0

はい、それは明確に、ありがとう。 – fabee

0

私はFundamental Matix Song ...

にあなたを参照してください。しかし、真剣に、おそらくそれは、ドットの製品で何か「正規」ですか?標準numpyのdot機能が正しく、個々の行と列に行列を分割するように作用するように見えるん乗算用のベクター例えば

、私がしなければ:それはとしてストレートフォワード行列の乗算を実行する場合に役立ちます代わりに

A = mat(random.rand(3,3)) 
B = mat(random.rand(3,3)) 
dot(A,B) == A*B 

は、私は疑問に思う:

F2 = np.linalg.inv(Mr.T) * E * np.linalg.inv(Ml) 

(N.B.

+0

numpyのドット関数を使用しています。これは、numpy配列で動作するためです。 F2/F2 [2,2]でF2をスケーリングすると正しい結果が得られることが分かりました。しかし、それはAPIによると、上からの計算は正しいはずなので、私はまだ混乱します。そして正直なところ、私はその曲がどのようにそれに加わるのか分かりません。私は基本的なマトリックスが何であるかを知っています、なぜOpenCVがそれを間違って取得するのかを知りたいだけです。 – fabee

+0

ああ、いくつかの行列が正規化されているかどうかのようです。以前はOpenCVでそれを気付かなかった。私は基礎となるソースコードを見ているかもしれません。この曲はあくまでも参考になった。あなたをさらに混乱させるお詫び! – timlukins

+0

ああ、大丈夫です。行列が正規化されていないことが重要ですか?私はそれをさらに使用すると間違った結果が出るでしょうか?曲については、少し荒い反応に私の側からお詫び申し上げます。私はあなたがそれを軽く意味したと確信しています。私は関数が実際にAPIで述べられているものとは異なるものを実際に計算するのはちょっと面倒です。 – fabee