OpenCV cvFindStereoCorrespondance - eiichiromomma/CVMLAB GitHub Wiki
OpenCV) cvFindStereoCorrespondence
(二枚のステレオ視の画像から視差を算出する。実際にはこの視差にパラメータを乗算して実空間での距離を求める。
定義
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 距離計測を参照