2012-04-17 11 views
5

私はEmin/OpenCVを使ってKinectカメラと外部カメラの校正をしようとしています。 私は立ち往生しており、本当に助けに感謝します。基本マトリックスを介した未校正カメラの修正

私は基本行列、すなわちエピポーラ幾何によってこれを選択しました。 しかし、結果は私が期待したとおりではありません。結果画像は黒色であり、全く意味がない。 MapxポイントとMapyポイントは、通常、すべて無限または無限に等しいか、またはすべてが0.00に等しく、まれに通常の値を持ちます。

これは私が整流を行うことを試みた方法です:

1)検索画像ポイントは、画像のセットから画像ポイント(すべてのカメラのための1)の二つの配列を取得します。私はチェス盤とFindChessboardCorners機能でこれをやった。

2)基礎行列検索

CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero); 

私は、画像の、あるいは単に是正しようとする二つの画像から、セット全体から収集されたすべてのポイントを通過していますか?

3)私はここに問題を抱えている...私はキャリブレーションを使用していないので、mapxとmapy

double scale = 0.02; 
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale); 
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale); 
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale); 
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale); 

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ; 

をゲット)ホモグラフィ行列に

CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold); 

4.を探します画像、カメラマトリックスと歪み係数は何ですか?どのように基本行列またはホモグラフィ行列からそれを得ることができますか?

5)リマップ

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255)); 

そして、これは良い結果を返すことはありません。誰かが私に何が間違っているか教えてもらえればと思う。

私は25組の画像とチェス盤パターンのサイズが9x6です。

答えて

0

O'Reilly出版の「Learning OpenCV」という本には、この特定のトピックに関する2つの完全な章があります。どちらも、OpenCVのインクルードルーチンcvCalibrateCamera2()とcvStereoCalibrate()を多用しています。これらのルーチンは、ここで書いたものと非常によく似たコードのラッパーであり、OpenCVライブラリを維持している人がより完全にデバッグできるという利点があります。それらは便利ですが、ルーチンに必要な入力を達成するためにかなり前処理が必要です。実際には、OpenCVディストリビューションのsamplesディレクトリのどこかにあるサンプルプログラムが、これらのルーチンを使用していて、チェスボード画像から較正/組み込み行列に移動する方法の例があります。あなたがこれらの場所のどれかを深く見ているなら、専門家からのアドバイスで目標を達成する方法が分かるはずです。

0

イメージポイントのイントリンシックパラメータが単位行列である場合、つまり、投影されていないイメージポイントでは機能しない場合、cv :: findFundamentalMatは機能しません

関連する問題