3

2 台のカメラを使用したマルチビュー シーンで C++ の open cv を使用しています。両方のカメラの内部パラメーターと外部パラメーターがあります。

ビュー 1 の (X,Y) ポイントを 2 番目のビューの同じポイントにマップしたいと思います。ポイントを 3D 世界に変換し、最終的にビュー 2 の新しい 2D ポイントになるために、固有マトリックスと外部マトリックスを使用する方法が少しわかりません。

4

1 に答える 1

3

ある画像で 2D 座標を取得し、追加情報なしで別の 2D 座標にマッピングすることは (通常) 不可能です。

主な問題は、左の画像の 1 つの点が右の画像の線 (エピポーラ線) にマッピングされることです。深さは自由なパラメーターであるため、可能な対応する場所は無数にあります。第 2 に、ポイントが正しいイメージに存在しない、つまりオクルードされている可能性は十分にあります。最後に、シーンにテクスチャがない場合や、繰り返し機能が多数含まれている場合など、どのポイントが正しい対応であるかを正確に判断するのが難しい場合があります。

基本行列 (cv::StereoCalibrateとにかく取得します) は、各カメラ内のポイント間の制約を与えx'Fx = 0ます:x'x

可能な解決策は次のとおりです。

  1. 1 つの画像内の 2D ポイントの 3D 位置を知っています。3D ポイントが共通の座標系にある場合はcv::projectPoints、投影先の他のカメラのキャリブレーション パラメーターを使用するだけです。

  2. SIFT や ORB などを使用して、疎な特徴の検出と照合を行います。次に、ホモグラフィを計算して、ある画像から別の画像にポイントをマッピングできます。これは、物事が平面であることについていくつかの仮定を立てます。パノラマ ホモグラフィを Google で検索すると、これについて詳しく説明している講義スライドがたくさんあります。

  3. カメラを調整し、エピポーラ整流 ( cv::StereoRectifycv::initUndistortRectifyMapcv::remap) を実行してから、ステレオ マッチャーを実行します。出力は、1 つのカメラから別のカメラへのピクセルごとのマッピングである、正確に必要なものを提供する視差マップです。つまり、left[y,x] = right[y, x+disparity_map[y,x]].

(1) が最も簡単ですが、その情報をすでに持っている可能性はほとんどありません。(2) はしばしば実行可能であり、適切である可能性があります。別のコメンターが指摘したように、平面性の仮定が失敗する場合は不十分です。(3) は一般的な (理想的な) ソリューションですが、独自の欠点があり、画像が密なマッチングに適していることに依存しています。

于 2017-04-22T23:32:28.547 に答える