2013-10-06 270 views
5

OpenCVでステレオペア画像から深さを推定しようとしています。私は2枚のrectificated画像における同じ点を見つけるために、ブロックマッチング技術を使用している視差マップからのOpenCv深度推定

   (Baseline*focal) 
depth =  ------------------ 
      (disparity*SensorSize) 

:私は、視差マップ及び奥行き推定を得ることができる持っています。 OpenCVでは、ブロック一致パラメータを設定することができます(例:BMState->numberOfDisparities)。

は、ブロックマッチング処理後:

cvFindStereoCorrespondenceBM(frame1r, frame2r, disp, BMState); 
cvConvertScale(disp, disp, 16, 0); 
cvNormalize(disp, vdisp, 0, 255, CV_MINMAX); 

私は深さ値が見つかりました:

if(cvGet2D(vdisp,y,x).val[0]>0) 
    { 
    depth =((baseline*focal)/(((cvGet2D(vdisp,y,x).val[0])*SENSOR_ELEMENT_SIZE))); 
    } 

しかしobtaied奥行き値がBMState->numberOfDisparitiesの値による前式でobtaied値と異なります結果値が変更されます。

このパラメータはどのように設定できますか?このパラメータを変更するにはどうすればよいですか?

おかげ

答えて

4

と右のいずれかに左のカメラからの動きは、純粋な翻訳である場合にのみ(特に、水平画像軸に平行)場合、単純な式が有効です。

実際にはこれはほとんどありません。例えば、画像をrectifyingの後に、すなわち公知の基本行列を用いてワーピングした後に、対応するピクセルが同じ行に属するように制約されることが一般的である。 で整流された画像が一致すると、整流ワープの逆数を使用して元の画像に再マッピングし、次に3D空間に三角形分割してシーンを再構成することができます。 reprojectImageTo3d

+0

あなたの答えはタクスです。ブロックマッチングプロセスで2つの整流された画像が得られるので、この式は正しく機能するはずですか?今度は、reprojectImageTo3D関数を使用しようとします。イタリア語版:Dal nome credo che tu sia italiano、quindi per una maggiore chiarezza(私の);イマジネーションは、前の数式の前に置かれていますか?再利用イメージを利用すると、 Grazie per la risposta。 – Speed87

+0

"うまくいくはずですか"を定義しますか?パラレルカメラ式は、整流された画像を観察する理想的なカメラに関して、特定のピクセルで深さを与えます。再構成は射影的に行われるが、正確で正確ではない。 [はい、私はイタリア語を話しますが、これは英語のみのフォーラムです] –

0

上記の式は、カメラ平面としては機能せず、イメージプレーンは同じではありません。すなわち、カメラはある高さに位置し、キャプチャする平面は地面に置かれます。だから、あなたはこの公式で少し修正を加えなければなりません。 これらの視差値と既知の距離は、多項式によってカーブフィッティングに適合させることができます。それから他の未知の距離に使用できる係数が得られます。 2番目の方法は、ラップ行列とreprojectimageTo3d(Opencv API)を使用して3Dポイントクラウドを作成することです。

関連する問題