Structure From Motion 事始め
PCも組み終わり,SFMの勉強に入っていきます.
まずは理論の勉強からですが,いきなり数式とにらめっこするのはつらいので,サンプルのアプリを落としてそのコードと教科書を往復して勉強をすることにしました.
題材
1.教科書
この本,ググるとPDFでまんま落ちてます.そのリンクを張るのはさすがに怖かったのでアマゾンリンクにしましたが...この教科書の4章にSFMの概要とサンプルコードに対しての説明が書かれてます.
- 作者: Daniel Lelis Baggio,Shervin Emami,David Millan Escriva,Khvedchenia Ievgen,Naureen Mahmood
- 出版社/メーカー: Packt Publishing
- 発売日: 2012/12/03
- メディア: ペーパーバック
- この商品を含むブログ (2件) を見る
2.サンプルコード
上記教科書にはチャプター毎にサンプルコードがあるようなのですが,このコードもGITに落ちてます.自分は4章のSFMを使います.
github.com
サンプルコードコンパイルまで
コマンド開始時点のフォルダははすべて workspace というフォルダのイメージで書いてます.
1.サンプルコードを落とします.
mkdir reps/mastering_opencv/build cd reps/mastering_opencv git clone https://github.com/MasteringOpenCV/code.git
2.OpenCV2.4.11を落とします.
上記サンプルコードは OpenCV3 系には未対応ということで,2.4.11を落としてコンパイルします.
gstreamer 周りのコンパイルが通らなかったので,ひとまずOFFでコンパイルしました.
mkdir reps/opencv-2.4.11 reps/opencv-2.4.11/install reps/opencv-2.4.11/installd reps/opencv-2.4.11/build cd reps/opencv-2.4.11 git clone https://github.com/opencv/opencv.git cd opencv git checkout 2.4.11 cmake -DCMAKE_INSTALL_PREFIX=../install -DBUILD_EXAMPLES=ON -DINSTALL_C_EXAMPLES=ON -DWITH_OPENGL=ON -DWITH_V4L=ON -DWITH_GSTREAMER=OFF -DWITH_QT=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA=YES -DCUDA_GENERATION=Auto ../opencv make install -j8 cmake -DCMAKE_INSTALL_PREFIX=../installd -DBUILD_EXAMPLES=ON -DINSTALL_C_EXAMPLES=ON -DWITH_OPENGL=ON -DWITH_V4L=ON -DWITH_GSTREAMER=OFF -DWITH_QT=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug -DWITH_CUDA=YES -DCUDA_GENERATION=Auto ../opencv make install -j8
3.SSBAを落とします.
サンプルコード内でバンドル調整をしているみたいのなので,必要なコードを落とします.
mkdir reps/SSBA/build cd reps/SSBA git clone https://github.com/chzach/SSBA.git cd build cmake -DCMAKE_BUILD_TYPE=Release ../SSBA-4.0/
4.Mastering OpenCV のサンプルコードを一部改変します.
これは自分の環境依存のせいかもしれないですが,そのままコンパイルが通らなかったので,一部 CMakeLists.txt とコードを改変しました.
1. CMakeLists.txt の変更
SSBA_LIBRARY_DIR, SSBA_INCLUDE_DIR, OpenCV_DIRを自分がビルド/インストールしたとこにポイントします.
自分の場合は,,,,
set(OpenCV_DIR "${CMAKE_SOURCE_DIR}/../../opencv-2.4.11/install/share/OpenCV")
set(SSBA_LIBRARY_DIR "${CMAKE_SOURCE_DIR}/../../SSBA/build") include_directories(${SSBA_LIBRARY_DIR}/../SSBA-4.0)
2. GPUSURFFeatureMatcher.h の変更
SURF 特徴量が nonfree パッケージに入っているので,下記の include を追記します.
#include <opencv2/nonfree/gpu.hpp>
3. Visualization.cpp
PCL, ROS メッセージ変換のメソッドのヘッダファイルのパスが異なっていたので,追記します.
#include <pcl/ros/conversions.h>
4. graphcuts.cpp
Cuda8.0 からはGraphCutsがサポートされていないらしく,下記の記述を追記します.
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
から
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
に変更します.