両眼立体視 (1) 基本原理と手順

目次

1. 両眼立体視システムの基本的な 4 つのステップ

2. 各ステップの原理

1. カメラのキャリブレーション

2. ステレオ補正

3. 3次元マッチング


1. 両眼立体視システムの基本的な 4 つのステップ

  1. カメラキャリブレーションは主に、単眼カメラの内部パラメータキャリブレーションと、双眼カメラの外部パラメータキャリブレーションの2つに分かれており、前者では各カメラの焦点距離、光学中心、歪曲係数などのパラメータを取得でき、後者では各カメラの焦点距離、光学中心、歪曲係数などのパラメータを取得できます。双眼カメラ間のカメラパラメータ 座標系の回転と平行移動の関係。
  2. ステレオ補正プロセスは、2 台のカメラで収集された元の画像を、カメラのキャリブレーション結果に基づいて補正することであり、補正された 2 つの画像は、同一平面上に位置し、互いに平行です。画像は同一線上にあります。
  3. ステレオ マッチングプロセスは、ステレオ補正された画像に基づいてピクセル点を照合することであり、照合に成功した点は、2 つの画像内の現実世界の特定の点の異なる位置を表します。
  4. 奥行き計算処理は、ステレオマッチング結果に基づいて視差マップを取得し、視差マップを通じて各ピクセルに対応する奥行きを計算して奥行きマップを取得する。

2. 各ステップの原理

1. カメラのキャリブレーション

  • 単眼カメラの内部パラメータ校正

      基本的な知識、具体的なプロセスのリファレンス: opencv カメラの内部パラメーターのキャリブレーション

      内部パラメータマトリックス:

           

      歪みパラメータ: k1、k2、k3 半径方向歪み、p1、p2 は接線方向歪み係数です。

  • 双眼カメラのキャリブレーション

       主に 2 つのカメラ座標系間の回転と平行移動の関係を計算するために、OpenCV を例として挙げると、最終的に回転行列 R、平行移動ベクトル T、必須行列 E、および基本行列 F を取得できます。

double err = cv::stereoCalibrate(object_points, 
                                 imagepointL, imagepointR,
                                 intrinsic_left, distCoeffs_left, 
                                 intrinsic_right, distCoeffs_right,
                                 srcImgSize, 
                                 R, T, E, F,
                                 CALIB_USE_INTRINSIC_GUESS,
                                 cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 30, 1e-6));

         

2. ステレオ補正

  •  なぜ立体視補正が必要なのでしょうか?

まず、理想的な双眼カメラ画像モデル     から始める必要があります

              

 

その中で、 b はベースライン、つまり 2 台のカメラの原点間の距離です。

              fl と fr はそれぞれ左カメラと右カメラの焦点距離であり、理想的な双眼カメラ fl=fr=f;

              cl と cr はそれぞれ左カメラと右カメラの光学中心であり、理想的な双眼カメラの場合、 cl=cr となります。

              xl と xr はそれぞれ、左カメラと右カメラの画像に投影された空間内の点 P の横座標です。

次に、幾何学的関係に従って、次のことが得られます。

\frac{b - (xl-cl)-(cr-xr)}{b} = \frac{zf}{z}

整頓された:

z = \frac{f*b}{xr-xl}

(xr-xl) こちらは視差差です。

深さ z を計算したい場合は、次のことを知っておく必要があることがわかります。

1. カメラの焦点距離 f、左右のカメラのベースライン b. これらのパラメータは、事前の情報またはカメラのキャリブレーションを通じて取得できます。

2.視差 d.左カメラの各ピクセル点 (xl、yl) と右カメラの対応する点 (xr、yr) の間の対応を知る必要があります。これは両眼視の中心的な問題です。視差とは、2 つのカメラ画像間のピクセル位置の違いを指しますステレオ ビジョン カメラの左画像の位置 (1,30) にピクセルがあり、右画像の位置 (4,30) に同じピクセルが存在すると仮定すると、視差値または差は (4-1)= となります。 3. 上式では視差値は奥行きに反比例します。

 そこで問題は、左の画像のピクセルについて、右の画像の点の位置をどのように決定するかということです。画像全体から一致するものを 1 つずつ検索する必要がありますか?

答えはいいえだ。極性の制約があるためですエピポーラ制約は、画像ペア内のピクセル点間の対応を解決するために非常に重要です。

  • 極線とは何ですか?

以下に示すように。C1 と C2 は 2 台のカメラ、P は空間内の点、P と 2 つのカメラ中心点 C1 および C2 は、エピポーラ平面と呼ばれる 3 次元空間内の平面 PC1C2 を形成します。エピポーラ面と 2 つの画像は、エピポーラ ラインと呼ばれる 2 本の直線で交差します。カメラC1におけるPの結像点はP1、カメラC2におけるPの結像点はP2であるが、Pの位置は事前に不明である。

私たちの目標は、左の図の点 P1 について、右の図でそれに対応する点 P2 を見つけて、点 P の空間位置、つまり空間オブジェクトと必要なカメラの間の距離 (深度) を決定できるようにすることです。 。

いわゆるエピポーラ制約とは、同じ空間点が 2 つの画像にそれぞれ画像化されており、左側の画像の投影点 p1 が既知である場合、右側の画像の対応する投影点 p2 は、 p1なので、マッチング範囲を大幅に狭めることができます。

エピポーラ制約の定義によれば、下の図で P2 がエピポーラ ライン上にある必要があることが直感的にわかります。そのため、P1 と対応する点 P2 を見つけるには、エピポーラ ラインに沿って検索するだけで済みます。

 

ただし、上記のプロセスでは、非常に理想的な状況 (2 台のカメラが同一平面上にあり、光軸が平行で、パラメーターが同じ)、つまり 2 台のカメラの撮像面が完全に平行で位置合わせされていると見なされます。シナリオによっては 2 台のカメラを独立して固定する必要があり、光学中心 C1 と C2 が完全に水平であることを保証することが難しいため、この仮定を現実の世界で確立することは基本的に困難です。光学中心が完全に水平ではありません。以下に示すように。2 台のカメラのエピポーラ線が平行ではないだけでなく、同一平面上にもないことがわかり、以前の理想モデルはもはや当てはまりません。

 以下に示すように、この状況で撮影された 2 枚ほどの写真を見てみましょう。左の図の 3 つの×印の点と、右の図の対応するエピポーラ線は、右の図の 3 本の白い直線であり、対応する検索領域です。これら 3 つの直線は水平ではなく、点ごとの検索は非常に非効率であることがわかります。

                            左の図の 3 つの点 (十字マーク) は、右の図の極線に対応します。右の図の 3 つの白い直線は、 

  • ステレオ補正

この現実の非理想的な状況に対応して、左右のカメラで撮影した画像ピクセルをステレオ補正によって再配置し、撮像面を理想的に平行に配置する必要があります。具体的には、2 つの画像 (キャリブレーションによって取得可能) にホモグラフィー行列変換を使用することにより、異なる方向にある 2 つの画像平面 (下図の灰色の平面) が同じ平面に再投影され、光軸が平行になります。これにより、以前の理想モデルが使用でき、2 台のカメラのエピポーラ ラインが水平になります。

ただし、2 台のカメラの光軸を平行にする方法はたくさんあります。次のことができます。

1) 左カメラは動かず、右カメラが動きます。

2) 2 つのカメラを中央などに回転させることもできます。

最も一般的な補正方法は、ブーゲ エピポーラ補正方法です。

ブーゲエピポーラ補正法: 左右のカメラの結像面がそれぞれ半回転するため、左右の画像の再投影によって生じる誤差が最小限に抑えられ、左右のビューの共通領域が最大になります。 。

CV_EXPORTS_W void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs1,
                                 InputArray cameraMatrix2, InputArray distCoeffs2,
                                 Size imageSize, InputArray R, InputArray T,
                                 OutputArray R1, OutputArray R2,
                                 OutputArray P1, OutputArray P2,
                                 OutputArray Q, int flags = CALIB_ZERO_DISPARITY,
                                 double alpha = -1, Size newImageSize = Size(),
                                 CV_OUT Rect* validPixROI1 = 0, CV_OUT Rect* validPixROI2 = 0 );

 画像補正後、左側の画像内のピクセルは、水平エピポーラ方向に沿って対応する点を検索するだけで済みます。下図を見ると、3点に対応する視差(赤い両矢印の線分)が異なっており、物体が遠くにあるほど視差は小さくなり、物体に近づくほど視差は大きくなっていることがわかります。 . これは私たちの常識と一致しています。

画像補正後の結果です。赤い二重矢印の線分が対応点の視差です

(1) 両眼補正前の左右カメラ画像

(2) 両眼補正後の左右カメラ画像

3. 3次元マッチング

上で述べたように、左の図の点について、右の図の水平エピポーラ方向に沿ってそれに最もよく一致するピクセルを見つけます。言うのは簡単ですが、実際に操作するのは簡単ではありません。なぜなら、上記はすべて理想的な仮定だからです。実際にピクセルを一致させると、いくつかの問題が見つかります。

1. 実際には、2 台のカメラが完全に同一平面上にあり、パラメータが一貫していることを確認することは非常に困難であり、計算プロセス中に誤差も蓄積されるため、左の写真の点について、右の写真の対応する点は、厳密には極端ではありません。オンラインです。ただし、極線の近くにあるはずなので、探索範囲を適切に広げる必要があります。

2. 単一ピクセル比較の堅牢性は非常に低く、照明の変化や視野角の違いの影響を受けやすくなります。

両眼ステレオマッチングは、マッチングコスト計算、コスト集計、視差計算、視差最適化の 4 つのステップに分けることができます。

  • マッチングコスト計算の目的は、マッチング対象のピクセルと候補ピクセルの間の相関を測定することです。2 つのピクセルが同じ名前の点であるかどうかに関係なく、マッチング コスト関数によってマッチング コストを計算できます。コストが小さいほど相関が大きく、同じ名前の点である可能性が高くなります。

        マッチング コストの計算方法は数多くありますが、従来の写真測量では、絶対値差分 (AD、絶対差分)、絶対差分の合計 (SAD、絶対差分の合計)、正規化相関係数 (NCC) が使用されていました。 、正規化相互相関) および 2 つのピクセルのマッチング コストを計算するその他の方法。コンピューター ビジョンでは、相互情報量 (MI、相互情報) 方法、センサス変換 (CT、センサス変換) 方法、ランク変換 (RT、ランク変換)マッチングコストの計算方法としては、)法やBT(Birchfield and Tomasi)法などがよく使われます。コスト計算アルゴリズムにはそれぞれ独自の特性があり、さまざまな種類のデータに対して異なるパフォーマンスを発揮するため、適切なマッチング コスト計算関数を選択することは、ステレオ マッチングにおいて無視できない重要なステップです。

各ピクセルが同名の点を探索する前に、視差探索範囲を指定することがよくありますが、視差探索D(D_{最小} \sim D_{最大})時には[公式]C[公式]を使用して視差探索を行います。各ピクセルの視差を保存し、範囲内の各視差のマッチング コスト値を保存します。マトリックス[公式]は通常DSI(Disparity Space Image)と呼ばれます。

図1 DSI図(C(x,y,d)は視差がdの場合のピクセル(x,y)のマッチングコストを表す)

  • コスト集計の基本的な目的は、コスト値がピクセル間の相関関係を正確に反映できるようにすることです。前のステップでのマッチング コストの計算では、多くの場合、局所的な情報のみが考慮され、2 つのピクセル近傍内の特定のサイズのウィンドウ内のピクセル情報を通じてコスト値が計算されます。これは、画像ノイズの影響を受けやすく、画像が領域内にある場合には、弱いテクスチャまたは繰り返しテクスチャ領域では、このコスト値はピクセル間の相関を正確に反映していない可能性が非常に高くなります。

        コスト集約は、隣接するピクセル間の接続を確立し、隣接するピクセルが連続的な視差値を持つ必要があるなど、特定の基準に基づいてコスト マトリックスを最適化します。この最適化は多くの場合グローバルであり、各ピクセルは特定の範囲内にあります。各視差の下での新しいコスト値は、同じ視差値または近くの視差値の下で隣接するピクセルのコスト値に基づいて再計算され、新しい DSI は行列 S で表されます。        

        実際、コスト集計は視差伝播ステップに似ています。信号対雑音比が高い領域では、より良いマッチング結果が得られます。初期コストは相関関係をよく反映し、最適な視差値をより正確に取得でき、それが伝播されます。比率が低くマッチング効果が低い領域では、すべての画像の値が最終的に真の相関関係を正確に反映できます。一般的に使用されるコスト集計方法には、スキャンライン方式、動的計画法、SGM アルゴリズムのパス集計方式などが含まれます。

 

  • 視差計算は、コスト集計後のコスト行列 S を通じて各ピクセルの最適な視差値を決定します。通常、勝者テイクオール アルゴリズム (WTA、Winner-Takes-All) を使用して計算されます。図に示すように、値はある画素の全視差におけるコスト値のうち、最小のコスト値に対応する視差が最適視差として選択される。このステップは非常に単純であり、集約コスト行列 S の値がピクセル間の相関を正確に反映する必要があることを意味します。また、前のコスト集約ステップが、ステレオ マッチングの精度を直接決定する非常に重要なステップであることも示しています。アルゴリズム。

 

  • 視差最適化の目的は、前のステップで得られた視差マップをさらに最適化し、誤った視差の除去、適切なスムージング、サブピクセル精度の最適化などのステップを含む視差マップの品質を向上させることです。アルゴリズムが使用されているかどうかを確認します。オクルージョンやノイズによって引き起こされる誤った視差を除去します。小さな接続領域の除去アルゴリズムを使用して孤立した外れ値を除去します。メディアン フィルター (Median Filter)、バイラテラル フィルター (バイラテラル フィルター) およびその他の平滑化アルゴリズムを使用して視差マップを平滑化します。さらに、ロバスト平面フィッティング、強度一貫性、局所一貫性など、視差マップの品質を効果的に向上させるいくつかの方法もよく使用されます。

         WTA アルゴリズムによって得られる視差値は整数ピクセル精度であるため、より高いサブピクセル精度を得るには、視差値をさらにサブピクセル細分化する必要があります。一般的に使用されるサブピクセル細分化手法は 1 次元です。 2次曲線フィッティング法とは、1次元の2次曲線を最適視差下のコスト値と左右の視差下のコスト値でフィッティングし、2次曲線の極小点で表される視差値を求めるものである。サブピクセル視差値として。

        ローカル マッチング アルゴリズムのステップは、通常、マッチング コスト計算、コスト集計、視差計算の 3 つのステップで構成され、グローバル アルゴリズムは、マッチング コスト計算、視差計算、視差の最適化の 3 つのステップで構成され、セミグローバル アルゴリズム SGM は 4 つのステップで構成されます。

OpenCV には次の 4 つのステレオ マッチング アルゴリズム関数が用意されていますが、BM と SGBM については後で詳しく説明します。

  1. ブロックマッチング(BM) ステレオBM
  2. セミグローバルブロックマッチング(SGBM) ステレオSGBM
  3. グラフカット(GC)cvStereoGCState()
  4. ダイナミックプログラミング(DP)cvFindStereoCorrespondence()

1 つ目は、最も単純なブロック マッチングであり、最も高速ですが、精度は最も低くなります。2 つ目は、速度と精度の妥協点であるセミグローバル高速マッチングです。3 つ目と 4 つ目は、グローバル ベースのマッチングです。

 

参考:

1. https://zhuanlan.zhihu.com/p/378738199

2.  https://www.cnblogs.com/zyly/p/9373991.html#_label1_2

3. https://zhuanlan.zhihu.com/p/159055657

4. https://zhuanlan.zhihu.com/p/31243203

おすすめ

転載: blog.csdn.net/weixin_40059786/article/details/121935076