Plane Sweeping Stereo 〜 導入編
いろいろと順番が前後してるんですが,キャリブもSFMも後でまとめるとして, Plane Sweeping Stereo を勉強&コード解剖したのでまとめておきたいと思います.
0.普通のステレオカメラ
SGMとか普通のステレオアルゴリズムって,基本的には校正済みの2画像に対して視差を求めると思います.細かい話は以前ブログで書いた下記のエントリに書いてあるんですが,
もう一度簡単に復習しておくと,,,,
上のメモに書いたんですが,ステレオカメラの原理的な?特性は2つあって
1.マッチングの探索候補が常に同じ行上にある.
これは演算速度のために仕方がないことですが,ステレオカメラを使う場合事前に必死でキャリブレーションして,左右のカメラでとった映像が完全に平行になるようにします.ここでいう「平行」というのが,「マッチングの探索候補が常に同じ行上にある」ということでして,例えば右の画像の(30,50)にあるピクセルの一致点を探すときに,左の画像では同じ行上(つまり(x,50))の点を探索します.
2.観測可能な奥行きに限度がある.(奥行きが大きくなるに従って,精度が著しく下がる.)
メモに書いてあるとおり,奥行きは視差に反比例する形で大きくなっていくので,ある程度奥行きが大きくなってしまうと視差がでなくなってしまいます.下記2つの要素を調整することである程度遠方まで見れるようにはなるのですが,,,
- 基線長(左カメラと右カメラの距離)を長くする.
- カメラの画角を小さくする.
ただ,上記の2つは既成品のステレオカメラを買うと変更できず....というところで,自作しないことにはちょっとつらいです.あと自動車の場合と違って,自律走行ロボットは割とうねうねと曲がりながら動くので,カメラのFOVを小さくすると横方向が殆どみえなくなってしまうという難点もあります.
ちなみに,自分がつくばチャレンジで使っているステレオカメラは下記のZedというカメラなんですが,このカメラで大体13m ~ 15mくらいまで見れます.(一応20mくらいまでは視差は出るのですが,ノイズとの切り分けが難しくなってきます.)この,「13m ~ 15m」ってとこがなかなか絶妙なところでして,屋外でロボットを走らせようと思うと,13m ~ 15m 周辺になにもモノがないエリアは無数に有ります.一方でLidarを使うと40mくらいまでビームが届くので,安定して自己位置推定できるようになります.
1.Plane Sweeping Stereoって?
で,「Plane Sweeping Stereo」ってナンジャラホイ?って話なんですが,校正していない複数の画像から視差を生成するためのアルゴリズムです.なんでこんなこと勉強してんの?って理由は2つ有りまして,,,
1.国際通りの三次元復元に SFM + MVS を使いたい.
SFMだけだと点群でしか復元できないので,MVSを使ってテクスチャを作ってあげればちょっとキャッチーになるかな?と思ってまして,それで勉強してます.
2.つくばチャレンジのロボットの自己位置推定用として.
「普通のステレオカメラ」の項目で,「ステレオの奥行きを伸ばすためには基線長を長くしてやればいい」と書いたのですが,Plane Sweep Stereo を使って一定距離ロボットが移動するたびにMVSを実行すれば奥行きが伸びるのでは?とおもって,こっちでも使えないかな...という淡い期待もあります.
2.参考文献
この「Plane Sweeping Stereo」,原理自体は結構昔(1996年)に考案されたみたいなんですが,VSLAMと組み合わせたりして若干ホットになりつつあるような気がしてます.
A Space-Sweep Approach to True Multi-Image Matching
原理を考案した論文です.必読です.
Real-time Plane-sweeping Stereo with Multiple Sweeping Directions
上の論文を実装して,Cudaを使うことでリアルタイムで回してます.
Real-Time Direct Dense Matching on Fisheye Images Using Plane-Sweeping Stereo
ピンホールモデルでなく魚眼モデルを直接使って,Plane-Sweeping Stereoを実施してます.画素の損失が少なくなったことで,3次元復元力が向上してます.
3D Modeling on the Go: Interactive 3D Reconstruction of Large-Scale Scenes on Mobile Devices
まだ詳しく読めてないですが,上の論文の原理を元に画素のマッチングを取る方法を工夫して精度の向上を図ってます.Project TangoっていうGoogleのプロジェクトがあったみたいなんですが,それの論文みたいですね.
で,最近気づいたんですけど,論文読んでて実装見たくなったら,「論文名+Github」ってググるとでてきますね(笑)この実装も有りました!で,コード読むだけだと結局読み流してしまうので,リファクタ+(写経?(笑))しました.
github.com
ということで,Plane Sweeping Stereoを解剖日記を「導入編」「理論編」「実装編」の3つに分けて残しておきたいと思います.