cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCVのPhaseCorrelate関数を改造してPOCステレオをやってみる

キネクトのデプスを見慣れた目で見ると、ステレオカメラのデプス推定精度の低さはつらいものがあります。ステレオ画像の精度向上のための様々なアルゴリズムの提案があり、最近評判の物に位相限定相関(POC)を用いたステレオマッチングがあります。一般的にPOCは2つの類似画像の位置ずれを検出するために使われています。

位相限定相関関数(Phase Only Correlation)

ステレオでないPOCがOpenCVで実装されている[2]そうなので、まずこれを見てみましょう。参照するソースコードは、\opencv249\sources\modules\imgproc\srcの下のphasecorr.cppです。その中で、cv::Point2d cv::phaseCorrelate(InputArray _src1, InputArray _src2, InputArray _window, double* response)関数を見つけてください。

POCの基本原理を理解しておくために、[3]の図を見ながら[1]の文献の2.1を読んでください.文字が多い数式は追うのが面倒ですが、図に書き起こすと単純です。openCVの実装からフローチャートを書いてみましょう。

f:id:cvl-robot:20140206164554p:plain図.PhaseCorreration関数の処理の流れ

ハン窓適用して画像の縁を落としてから、フーリエ変換した2つの画像のうち一方を共役にして掛け算して大きさで割って、逆フーリエ変換したものが位相限定相関関数です。実装では、POC関数は数式ではなく実数値の画像として得られます。精度向上のための肝は、位相限定相関関数の求め方よりもサブピクセル相関ピーク位置の推定方法にあります。 

一次元POCステレオ

位相限定相関関数を用いると、2枚の類似画像の位置ずれを高精度で求めることができます。これを、ステレオ対応点探索でよく使われるブロックマッチングなどの代わりに使ってやろうというのがPOCステレオです。つまり、左右2枚の入力画像から、探索窓をそれぞれに設定し、もっとも高いピークが得られた場所を対応点として、探索窓を画像全体に走査していくことでステレオマッチングします。

ただし、従来のブロックマッチングのように総当たりでやるのではなく、階層化して高速化しようという提案がなされています。[1]の文献とOpenCVのPhaseCorrelation関数を用いて、(あまり処理速度を考えずに)素直に実装していくことにしましょう。

 

f:id:cvl-robot:20140206171040p:plain

図.tsukuba_l.png

f:id:cvl-robot:20140206171100p:plain

図.tsukuba_l.png

f:id:cvl-robot:20140210224735j:plain

図.1次元POCの出力結果(窓幅32pixel)

入力は、すでに平行化処理がされている2枚のグレースケール画像で、出力は視差に色を付けて可視化したものです。論文に紹介されている(A)窓関数の適用,(B)スペクトルの重み付け,(C)ピークモデルのフィッティング,(D)複数の一次元画像信号の利用,を適用しています。

実装に工夫はしておらず一部OpenCVのソースを流用しています。速度は遅いです。高速化はOpenCVFFTをやめて、FFTWやOKFFTなどのシンプルなライブラリで1次元FFT用にメモリの初期化を初回だけで済ませるように書き起こせば、もうちょっと早くなるかも。根本的には、探索窓の重なり部分の計算の無駄をどうやって省くか。探索方向を盾にしてリングバッファにFFT結果を持たせておくか、大量のメモリを用意して、画像上の角窓のFFTをあらかじめすべて計算して持っておくなど。

結果が思ったように良くならなかったのでバグが残っているものと思われます。問題を見つけたらぜひフィードバックをお願いします。

f:id:cvl-robot:20140210232347p:plain

f:id:cvl-robot:20140210230656j:plain

参考文献:

[1]酒井修二, 伊藤康一, 青木孝文, 運天弘樹, "基線長変化にロバストなステレオ画像間の高精度対応付け手法," 電子情報通信学会論文誌D, Vol. J95-D, No. 8, pp.1609--1622, August 2012.

[2]詠み人知らずの備忘録, 位相限定相関(POC) まとめ

[3]rest term, 位相限定相関法