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について解説されていました↓


スポンサーリンク

関連記事

Photogrammetry (写真測量法)
3Dグラフィックスの入門書
Point Cloud Libraryに動画フォーマットが追加されるらしい
iPhoneで3D写真が撮れるアプリ『seene』
ポイントクラウドコンソーシアム
WordPress on Google App Engineを1週間運用してみて
Autodesk Mementoでゴジラを3次元復元する
仮想関数
Unity ARKitプラグインサンプルのドキュメントを読む
OpenCV 3.1のsfmモジュールを試す
Raspberry Pi 2を買いました
Russian3DScannerのトポロジー転送ツール『WrapX』
Unityからkonashiをコントロールする
オープンソースのロボットアプリケーションフレームワーク『ROS (Robot Operating S...
ブラウザ操作自動化ツール『Selenium』を試す
ベイズ推定とグラフィカルモデル
AMIMOTO(PVM版)で作成したインスタンスをAMIMOTO (HVM版)へ移行する
GoogleのDeep Learning論文
MFnMeshクラスのsplit関数
Adobeの手振れ補正機能『ワープスタビライザー』の秘密
Deep Learningとその他の機械学習手法の性能比較
OpenCLに対応したオープンソースの物理ベースレンダラ『LuxRender(ルクスレンダー)』
YOLO (You Only Look Once):ディープラーニングによる一般物体検出手法
OpenCV
オープンソースの人体モデリングツール『MakeHuman』のAPI開発プロジェクトがスタート
Photoshopで作る怪獣特撮チュートリアル
OpenCVの超解像(SuperResolution)モジュールを試す
自前Shaderの件 解決しました
書籍『3次元コンピュータビジョン計算ハンドブック』を購入
IronPythonを使ってUnity上でPythonのコードを実行する
Windows10でPyTorchをインストールしてVSCodeで使う
OpenMayaのPhongShaderクラス
R-CNN (Regions with CNN features):ディープラーニングによる一般物体...
Pythonのソースコードに特化した検索エンジン『Nullege』
Python拡張モジュールのWindows用インストーラー配布サイト
UnityのGameObjectの向きをScriptで制御する
Raspberry PiでIoTごっこ
畳み込みニューラルネットワーク (CNN:Convolutional Neural Network)
プログラミングスキルについて考える
読みやすくて高速なディープラーニングのフレームワーク『Caffe』
ZScript
Javaで作られたオープンソースの3DCGレンダラ『Sunflow』

コメント

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

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