4

OpenCV の初心者である私は、openCV をビルドし、Qt をインストールして、サンプルhttp://code.google.com/p/opencvstereovision/source/checkoutを正常に実行しました。その結果、左右のウェブカメラがキャプチャされ、キャリブレーション後に両方の調整された画像と深度マップが得られます。私は次のことをしたいです。オブジェクトをクリックして、これらの左または右の画像のいずれかに焦点を合わせます。次に、他の画像で対応するピクセルを検出し、このオブジェクトまでの距離を計算します。今何をすべきかわからないので、ガイドが必要です。たぶん、最初に対応する点を計算すれば、残りを解決できるかもしれません。これどうやってするの?

4

2 に答える 2

4

何が必要かをよく理解しているようです。これはちょっとした虫の缶詰です。そのため、標準的な説明については、有名なハートレー & ジッサーマンの本を入手することをお勧めします。関連する章へのリンクを次に示します。

しかし、簡単に言えば...

opencvstereovision ラッパー クラスを直接使用したことはありませんが、キャリブレーション (カメラの組み込みおよび外部) の頭痛の種が取り除かれ、平面ジオメトリのホモグラフィ マトリックス (H) または基本マトリックス (F) を介して整流が計算されたようです。より複雑なエピポーラ ジオメトリの場合。

おそらくこの元の投稿に似ています。

この修正が意味することは、各画像の同じポイント間の数学的マッピングが確立されたことです。

以前の回答(私から) では、Fundamental マトリックスを使用して三角測量を実行することで数学を行うことができます。つまり、距離を計算します。

ただし、この距離は画像座標フレーム内 (ピクセル単位) のみであることに注意してください。

「現実世界」の測定(つまり、実際の物理的距離)を実行するために実際に必要なのは、基本行列とカメラの組み込み関数 (K) を組み合わせた基本行列 (E) の計算です。現実の世界。

于 2013-01-16T15:25:57.487 に答える
1
class StereoVar
{
StereoVar();
StereoVar(    int levels, double pyrScale,
                                int nIt, int minDisp, int maxDisp,
                                int poly_n, double poly_sigma, float fi,
                                float lambda, int penalization, int cycle,
                                int flags);
virtual ~StereoVar();

virtual void operator()(InputArray left, InputArray right, OutputArray disp);

int        levels;
double    pyrScale;
int        nIt;
int        minDisp;
int        maxDisp;
int        poly_n;
double    poly_sigma;
float    fi;
float    lambda;
int        penalization;
int        cycle;
int        flags;

...
};

参照: http://docs.opencv.org/modules/contrib/doc/stereo.html

于 2013-01-16T15:11:52.347 に答える