OpenCV cvFindStereoCorrespondance - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) cvFindStereoCorrespondence

二枚のステレオ視の画像から視差を算出する。実際にはこの視差にパラメータを乗算して実空間での距離を求める。

CvCalibFilterによるステレオ視も参照

定義

cvFindStereoCorrespondence(
    const CvArr* leftImage, const CvArr* rightImage,
    int mode, CvArr* depthImage,
    int maxDisparity,
    double param1, double param2, double param3,
    double param4, double param5 );

引数

  • leftImage
    • 左目画像。8bitグレイスケール
  • rightImage
    • 右目画像。8bitグレイスケール
  • mode
    • 視差の検出アルゴリズム(今はCV_DISPARITY_BIRCHFIELDだけサポート)
  • depthImage
    • 算出される距離画像。8bitグレイスケールで、差がない場合(要するに遠い場合)が0、最大距離(maxDisparityl)が255になる。結構暗いので画像の正規化を行なった方が良い。
  • maxDisparity
    • 存在しうる最大の視差。この値は対象物がカメラから近い程大きい。値が大き過ぎるとその分処理が遅くなる。
  • param1, param2, param3, param4, param5
    • アルゴリズムに依存したパラメータ
    • param1はオクルージョン(視差で片目にしか見えない部分)のペナルティ
    • param2は一致した際の得点
    • param3は一致となった塊で不一致(左右のみ?)となったピクセル数に関して信頼できる数
    • param4は一致となった塊で不一致(左右のみ?)となったピクセル数に関してまあまあ信頼できる数
    • param5は一致となった塊で不一致(左右のみ?)となったピクセル数に関して信頼性の薄い数

param1,2が使われる評価式は論文参照。 param3,4,5は極めて分かり難い。(下の解説も自信無し)

Each pixel is assigned a level of reliability, which is determined by the number of
contiguous pixels in the column agreeing on their disparity.

と書かれているため視差ではなく、比較する領域の中で怪しいピクセルのずれが少ない=>ほぼ一致している、多い=>パラパラに一致している(部分的に一致したように見えるだけ)という事かも。

確かに

右| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|
左| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|

がピクセルとすると、

右| x| x| A| A| A| A| x| B| B| B| B| B| B| B| B| x| x| x| x|
左| x| A| A| A| A| A| x| B| B| B| B| B| B| B| B| B| x| x| x|

というグループで一致した場合と

右| x| x| x| x| x| A| A| x| B| B| B| B| B| B| B| B| B| x| x|
左| x| A| A| x| B| B| B| B| B| B| B| B| B| x| x| x| x| x| x|

というグループで一致した場合では前者の方が信頼性が高い。

1998年の論文によるとSlightly reliable, Moderately reliable, Highly reliableの3カテゴリに分け、Slightlyなものに対してはディフェンシブに対応し、Moderatelyなものを動的に扱って最適解を探すらしいのだが、3値与えるということは領域は4つになる。 ざっと読んだところでは恐らく

1~param3: Hightly
param3~param4: Moderately
param4~param5: Slightly
param5~: 信頼無し

のような気がするが、1999年の論文ではこのパラメータは姿を消して単一の係数になったようだ。

Birchfieldアルゴリズムでのデフォルト値は

param1 = 25, param2 = 5, param3 = 12, param4 = 15, param5 = 25

となっているが、公式リファレンスのサンプルでは

cvFindStereoCorrespondence( leftImage, rightImage, CV_DISPARITY_BIRCHFIELD, depthImage,
                           50, 15, 3, 6, 8, 15 );

としている事からもこの値は多過ぎだろう。

param3, param4, param5の大小関係はparam3<param4<param5となる。

というわけでparam3,4,5である程度の門前払いを食らわせて、param1,2のパラメータで評価を行なっているようだ。

これらの詳細については"Depth Discontinuities by Pixel-to-Pixel Stereo" (Stanford University Technical Report STAN-CS-TR-96-1573, July 1996)およびDepth Discontinuities by Pixel-to-Pixel Stereo を参照のこと

サンプルソースと処理結果

OpenCV 距離計測を参照