OpenCVでカメラ画像から自己位置認識 (Visual Odometry)

書籍ROSではじめる ロボットプログラミング」を一通り読み終わって、何となくロボットの自己位置認識の重要性を感じている。



ロボット自身の移動量を計測する手法全般を”Odometry“と言うらしい。
中でも1番簡単なやり方は、車輪などの駆動装置の回転数を加算して移動距離とみなす方法。これはWheel Odometryとか呼ばれるらしい。この手法は手軽だがもちろん欠点もあって、車輪が滑るなどして空転した分も移動量として加算されてしまう。なので、Wheel Odometryではロボットが遠くへ移動するほど、どんどん誤差が溜まってしまう。

これに対して、カメラ画像を使って自己位置認識を行うのがVisual Odometry(VO)という分野。ロボットの自己位置認識では、ステレオカメラやDepthカメラといった3Dカメラを用いたVisual Odometryの手法がたくさんあるようだ。

以前見たコレは単眼カメラで撮影した2Dの画像を用いて自己位置を認識するMonocular Visual Odometry手法の1つ↓
画像認識による位置情報取得 - Semi-Direct Monocular Visual Odometry (SVO)
今日たまたまTwitterのTLで見かけたやつ。 単眼のカメラ映像からリアルタイムに位置情報を取得している。 論文はこちら そして、GitHubにROSで動作するソースコードが公開されている。


この技術のすごさがやっとわかってきた。
このSVO(Semi-Direct Monocular Visual Odometry)はROSで試せるようですよ↓
http://kivantium.hateblo.jp/entry/2014/07/01/000651


スポンサーリンク


単眼カメラによるVisual Odometry技術に関するチュートリアル、およびOpenCVを使って実装したサンプルが公開されているのを知った。↓
https://avisingh599.github.io/vision/visual-odometry-full/
https://avisingh599.github.io/vision/monocular-vo/

Monocular Visual Odometry using OpenCV

ソースコードはこちら↓

mono-vo

これは、OpenCV 3.0をベースにMonocular Visual Odometry手法(単眼カメラによる自己位置認識)を実装したものです。


スポンサーリンク
アルゴリズム

基本行列の推定にNisterの5点アルゴリズムを使用し、トラッキングにはFAST特徴量とKanade-Lucas-Tomasi Feature Tracker(Lucas–Kanade法)を使用しています。
詳細はこちらのレポートこちらのブログ記事をご覧ください。

注意事項:
このプロジェクトはまだ相対スケールの推定精度が低いです。そのため、スケール情報はKITTIデータセットのground truthファイルから取得しています。

見たところ、ソースコードはそれほど大規模じゃなさそうだけど、OpenCVを使うとそんなに簡単に書けちゃうものなのだろうか。
ここで出てくるKITTIデータセットというのは自動車ビジョン向けの大規模データセットらしいです。↓

自動車ビジョン向けの新しい大規模データセット「KITTI Vision Benchmark Suite」

The KITTI Vision Benchmark Suite

このVisual Odometry技術でロボットの移動量を正確に認識して、さらにその情報から地図を作成するところまで発展するとSLAMなんですかね。(良く解ってない)

2通りの再構成方法

カメラで撮影した連続画像(動画)から移動量を測るための再構成方法には大きく2通りあるらしい。

  • indirect (feature-based):画像から特徴点を抽出し、疎(sparse)な情報のマッチングで再構成する
  • direct:密(dense)な画素情報をそのまま使って再構成する

上記mono-voのコードは特徴点ベースだから、indirectな方法を実装しているということですね。

単眼カメラによるSLAMで有名なLSD-SLAMは、directな手法。↓
http://vision.in.tum.de/research/vslam/lsdslam

LSD-SLAMのソースコードは公開されてはいるけど、まだ試せるほど知識がない。

追記:directな手法とindirectな手法を組み合わせたDirect Sparse Odometry(DSO)という手法があるらしい↓
https://vision.in.tum.de/research/vslam/dso

DSO: Direct Sparse Odometry

ソースコードもある↓
https://github.com/JakobEngel/dso

追記:第1回3D勉強会@関東でDSOについて解説されていました↓


スポンサーリンク

関連記事

OpenCV3.3.0でsfmモジュールのビルドに成功!
1枚の画像からマテリアルを作成できる無料ツール『Materialize』
機械学習で遊ぶ
Photogrammetry (写真測量法)
BlenderでPhotogrammetryできるアドオン
Open Shading Language (OSL)
adskShaderSDK
JavaScriptとかWebGLとかCanvasとか
Active Appearance Models(AAM)
OpenCVで平均顔を作るチュートリアル
OpenCV 3.1から追加されたSfMモジュール
書籍『仕事ではじめる機械学習』を読みました
ニューラルネットワークと深層学習
網元AMIで作ったWordpressサイトのインスタンスをt1microからt2microへ移行した
MFnMeshクラスのsplit関数
Google App Engine上のWordPressでAmazonJSを利用する
OpenCVでiPhone6sのカメラをキャリブレーションする
画像中の人物表面のUV座標を推定する『DensePose』
ブログが1日ダウンしてました
WebGL開発に関する情報が充実してきている
iPhoneで3D写真が撮れるアプリ『seene』
python-twitterで自分のお気に入りを取得する
Mayaのレンダリング アトリビュート
html5のcanvasの可能性
バージョン管理の履歴を可視化するツール『Gource』
ポリゴンジオメトリ処理ライブラリ『pmp-library (Polygon Mesh Process...
Raspberry PiのGPIOを操作するPythonライブラリ『RPi.GPIO』の使い方
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
まだ続くブログの不調
C#で使える可読性重視のディープラーニングライブラリ『KelpNet』
『Deep Fluids』流体シミュレーションをディープラーニングで近似する
オープンソースのSfM・MVSツール『COLMAP』
Adobeの手振れ補正機能『ワープスタビライザー』の秘密
機械学習手法『Random Forest』
Unityで使える数値計算ライブラリ『Math.NET Numerics』
統計的な顔モデル
PythonでMayaのShapeノードプラグインを作る
Mayaのシェーディングノードの区分
Mayaのプラグイン開発
プログラムによる景観の自動生成
MeshroomでPhotogrammetry
書籍『OpenCV 3 プログラミングブック』を購入

コメント

  1. […] monocular-visual-odometry-using-opencv [OpenCV][カメラ] […]

  2. […] OpenCVでカメラ画像から自己位置認識 (Visual Odometry) […]