Bundle Adjustment のためのcvsbaをROS (catkin)で使うために

はじめに

SfM(Structure from Motion)とかいう単眼カメラを用いた三次元形状復元+自己位置推定手法を実装するためには, Bundle Adjustmentという多画像からパラメータ,3次元形状を推定する工程を実装する必要があるようです[1].
自己実装は面倒なので,OpenCVを用いて実装されたcvsba[2]というライブラリがあるのでそれを使います.

インストール

Ubuntuへのインストールは公式サイト[2]見ればいいので省略します.
ROS(catkin)で使用するためCMakeLists.txtには,以下の様に書けば動作するようです[3].

cmake_minimum_required(VERSION 2.8.3)
project(local_test)

find_package(catkin REQUIRED COMPONENTS
  roscpp
)
find_package(OpenCV REQUIRED)
LINK_LIBRARIES(cvsba)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES local_test
#  CATKIN_DEPENDS roscpp rospy
#  DEPENDS system_lib
)

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_iNCLUDE_DIRS}
)

 add_executable(cvsba_test src/cvsba_test.cpp)

 target_link_libraries(cvsba_test
   ${catkin_LIBRARIES}
   ${OpenCV_LIBRARIES}
 )

OpenCV関係に加えて

LINK_LIBRARIES(cvsba)

の一文を加えれば良いようです.

参考文献

  1. 3次元復元のためのバンドル調整の実装と評価
  2. cvsba
  3. 理科系の備忘録,sample CMakeLists.txt
;(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ if (pre.className.indexOf("gist") !== -1) { return } var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) || 0 ol.className = "preLine" ol.setAttribute("role", "presentation") // no lang, no line-number if( pre.className && ! /lang-./.test(pre.className) ){ br.length += 1 } for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)