3

OpenCV(Pythonインターフェイス)を使用してステレオカメラを調整しようとしています。最初に2台のカメラをcalibrateCamera2で別々にキャリブレーションし、次にパラメーターをstereoCalibrateにフィードしました

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)

(OpenCVブックで説明されているように)エピポーラ制約を使用して結果を確認すると、平均誤差は約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にまったく似ていません。私が間違っていることは明らかですか?ヘルプは大歓迎です。

編集: dotとinvはnumpyからのものです。

4

2 に答える 2

4

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

于 2012-05-03T15:13:16.603 に答える
0

基本的なマティックスの歌を紹介します...

しかし、真剣に、おそらくそれは内積の「正規化」の何かですか?標準のnumpydot関数は、乗算のために行列を個々の行と列のベクトルに分割するように正しく機能するようです。

たとえば、私がそうする場合:

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)

(NB私はここでnumpy行列を扱っています)

于 2012-04-17T12:51:30.053 に答える