2011-02-01 31 views
3

私は画像の視差マップを持っています。これを3Dポイントと法線のセットに変換する必要があります。これを行うにはどうすればよいですか?これを行うことができる既存の実装はありますか?視差マップを3Dポイントに変換

答えて

1

Gnu Triangulated Surfaceライブラリ?

私が奥行きマップ(または望むならば視差マップ)を作成して元のカメラのキャリブレーションを知っている前にこれをやっていたら、ポイントのR3への再投影を実行することができました。

各点の近傍(元の隣接ピクセルによる)を知ることは、それらを接続するための基本的な三角測量を作成することは非常に些細なことです。

(あなたがこれを知らなかった場合は...ドロネー三角形分割または他のより高度なアルゴリズムのいくつかのフォームを試行する必要があります)

あなたはすべてを保証するために、各三角形の正しい頂点の順序を取得していることを確認します法線は正しい方法を/一貫して指しています。

Meshlabは、追加の後処理に非常に便利です。

-1

視差マップはx、y、f(z)を与えます。視差をzに変換する方法を知るには、カメラのキャリブレーションが必要です。

私は画像の視差マップは、通常、完全にフラットになりの視差マップ画像

を持っている...

+0

いいえ、視差マップは、イメージスペース内のxとyを持つ(x、y、視差)のセットです。これを3Dポイントのセットに変換して、OPがこれを行う方法を求めています。 – etarion

+0

@etarionあなたが正しいです、私は私の答えを変更します。 – koan

1
 cvFindStereoCorrespondenceBM(frame1r, frame2r, disp, BMState); 

     /*  cvShowImage("camera1", frame1); 
       cvShowImage("camera2", frame2);   */  
     //  cvConvertScale(disp, disp, 16, 0); 
       cvNormalize(disp, vdisp, 0, 256, CV_MINMAX);     
       cvShowImage("disparity", vdisp);    
       cvReprojectImageTo3D(disp, Image3D, &_Q);    
       cvShowImage("depthmap",Image3D); 

このコードスニペットは私が願っています。ここでのコードの説明は次のとおりです。右カメラと左カメラの画像を整理してBMstateを定義すると、これをcvFindStereoCorrespondenceBMに渡して視差画像を見つけました。次に、3D点をImage3Dとして格納する次元3の行列を定義する。 OpenCVのcvReprojectImageTo3D我々はステレオ対応し得るQ行列を渡すことで機能することで、私たちは、あなたがこれだけの機能がスピードを向上させることができ、3Dポイントを持っている必要がある場合は、3Dの設定は、その2D画像

+0

答えが役に立つと分かっていれば、あなたの答えはもっと役に立ちます。事実上純粋なコードスニペットは多くのアップフォースを得られない傾向があります。 –

+1

Donald Fellows、説明を編集 – nbsrujan

-1
@ here is calculation which may help you 

    % %Z = fB/d 
    % where 
    % Z = distance along the camera Z axis 
    % f = focal length (in pixels) 
    % B = baseline (in metres) 
    % d = disparity (in pixels) 
    % % After Z is determined, X and Y can be calculated using the usual projective   camera equations: 
% 
    % X = uZ/f 
    % Y = vZ/f 

% where 
% u and v are the pixel location in the 2D image 
% X, Y, Z is the real 3d position 

    % Note: u and v are not the same as row and column. You must account for the image center. You can get the image center using the triclopsGetImageCenter() function. Then you find u and v by: 

    % u = col - centerCol 
    % v = row - centerRow 

    % Note: If u, v, f, and d are all in pixels and X,Y,Z are all in the meters, the units will always work i.e. pixel/pixel = no-unit-ratio = m/m. 
+0

コードに説明を追加する方が良いでしょう。 SOは "コードライブラリ"ではなく、援助サイトです。説明を追加することは、コードの問題だけでなく、どのように働いているのか、問題の解決法と同じように作業原理も重要な問題に答える最良の方法です。 –

関連する問題