私は 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) 私のプロセスは正しいですか? カメラが 35cm 離れているため、オフィスでチェス盤を両方のビューに合わせて移動するのは簡単ではないため、カメラの固有のキャリブレーションを別のプロセスとして行ってきました。カメラ ビューの 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) に対して正しいと思われますか?
ヒントをありがとうございました...私はしばらくこれに固執しています...そして、プロセスのどの部分がエラーを引き起こしているのか本当にわかりません。ヒントや提案は大歓迎です...