5

Emgu/OpenCV を使用して、Kinect カメラと外部カメラのキャリブレーションを行おうとしています。私は立ち往生しており、何か助けていただければ幸いです。

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

これは私が修正を試みた方法です:

1.)イメージ ポイントの検索 は、イメージ セットからイメージ ポイントの 2 つの配列 (カメラごとに 1 つ) を取得します。私はチェス盤と FindChessboardCorners 関数でこれを行いました。

2.) 基本行列を見つける

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

画像のセット全体から収集したすべてのポイントを渡しますか、それとも修正しようとしている 2 つの画像からのみ渡しますか?

3.)ホモグラフィ行列を見つける

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

4.) 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) ;

ここで問題があります...キャリブレーションされた画像を使用していないため、カメラの行列と歪み係数は何ですか? 基本行列またはホモグラフィ行列からどのように取得できますか?

5.)リマップ

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

そして、これは良い結果を返しません。誰かが私が間違っていることを教えてくれれば幸いです。

25 組の画像とチェス盤のパターン サイズ 9x6 のセットがあります。

4

2 に答える 2

0

O'Reilly 出版の本「Learning OpenCV」には、この特定のトピックに特化した 2 つの完全な章があります。どちらも、OpenCV に組み込まれているルーチン cvCalibrateCamera2() と cvStereoCalibrate() を多用します。これらのルーチンは、ここで記述したものと非常によく似たコードのラッパーであり、OpenCV ライブラリを維持している人々によってより徹底的にデバッグされているという追加の利点があります。どちらも便利ですが、ルーチンへの必要な入力を得るにはかなりの前処理が必要です。実際には、OpenCV ディストリビューションのサンプル ディレクトリの奥深くに、これらのルーチンを使用するサンプル プログラムがあり、チェス盤の画像からキャリブレーション/組み込み行列に移行する方法の例が含まれています。これらの場所のいずれかを詳しく見てみると、

于 2012-07-15T19:08:22.930 に答える