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 のセットがあります。