7

私は OpenCV 用の優れた Emgu C# ラッパーを使用して、自作のステレオ リグから画像を収集しています。2 台のウェブカメラを 35 cm 離して木片にボルトで固定し、10 ~ 20 m の範囲で深度マップを作成できるようにしました。できる限り平行になるように設定しました (三角測量テストから約 89.3 度)。

これらから視差マップを作成しようとしていますが、プロセスはコードとして機能しますが、結果は非常にランダムです。これは、ステレオ修正を実行しようとするたびに、非常に異なる結果が得られ、画像がひどく歪んでいて、画面にほとんど何も表示されないことを意味します。

私が理解しているように、これを行う方法は次のとおりです。


1) チェス盤のパターン (例: 6 x 8 の内側の角) を印刷し、平らなものに貼り付けます。

2) カメラ 1 で、チェス盤を完全に見えるように、異なる位置で約 10 枚の写真を撮影します。

3) CameraCalibration.FindChessboardCorners を使用して、内側の角 (6 x 8) を見つけます。

4) img.FindCornerSubPix() を使用して、これらの角の位置をサブピクセル レベルに絞り込みます

5) CameraCalibration.CalibrateCamera() を使用して固有のカメラの詳細を計算し、これを XML ファイルとして保存します。

6) カメラ 2 について上記を繰り返します。

7) これで内部カメラの歪み情報が得られたので、ステレオ写真のペアを取得し、事前に計算された内部データで CameraCalibration.StereoCalibrate() を使用して外部情報 (カメラ 1 と 2 間のオフセットと回転) を計算できます。

8) CvInvoke.cvStereoRectify() と CvInvoke.cvInitUndistortRectifyMap() を使用して、次に CvInvoke.cvRemap() を使用して出力イメージを作成します。出力イメージは Y 方向に並べられるため、ステレオ対応テストの 1 つを実行できます。

アクセス違反エラーなしで cvStereoRectify を動作させるには、Emgu 2.1 ver 806 を使用する必要があることがわかりました。


私の質問は次のとおりです。

A) 私のプロセスは正しいですか? カメラが 35c​​m 離れているため、オフィスでチェス盤を両方のビューに合わせて移動するのは簡単ではないため、カメラの固有のキャリブレーションを別のプロセスとして行ってきました。カメラ ビューの 1 つ。値は固有であるため、これらはカメラに関連しているため、ステレオ手順に転送する必要があると考えました。これは正しいです?

cvStereoRectify プロセス中に固有の値が変更され、非常に異なるものになっているようです。

例えば。cvStereoRectify 後の最初の段階の歪み値 = 0.22、-1.2、0.01、-0.01、2.6 = 10、-489、-0.03、-0.09、13208 に変更されました。

私は専門家ではありませんが、最初のセットは他の人のコメントから見たものに似ているようで、2 番目のセットはかなり外れているようです!

B) cvStereoRectify 中に更新される固有 + 歪み値を停止する方法はありますか?

C) これは本質的な値 (937,0,290,0,932,249,0,0,1) に対して正しいと思われますか?

ヒントをありがとうございました...私はしばらくこれに固執しています...そして、プロセスのどの部分がエラーを引き起こしているのか本当にわかりません。ヒントや提案は大歓迎です...

4

1 に答える 1

0

ここ数年 EMGU を使用していませんが、カメラと Kinect のキャリブレーションに使用していました。

長方形が完全に水平である場合、長方形の角の順序に混乱が生じる可能性があることがわかりました. 長方形が 45 度回転するようにボードを設定してみてください (つまり、正面から見ると、より菱形に見えるでしょう)。

私の非常に基本的な理解は、これにより、両方のカメラがカウントを開始する最初のコーナーと同じコーナーを確実に選択できるようになるということです。

これで問題が解決するかどうかは保証できません。コードに深刻な問題があり、チェス盤が平らなときに通常の結果を生成できなかった可能性があります。繰り返しますが、テストにそれほど時間はかからず、うまくいくかもしれません。

于 2014-03-24T11:07:18.160 に答える