OpenCV 3.3.0 contribのsfmモジュールのサンプルを動かしてみる

数度のトライを経て、OpenCVのバージョン3.3.0でやっとsfmモジュールのビルドが通ったわけです。



ようやくサンプルを試す段階に来た。参考にしてるQiita記事後編へやっと進める。↓
http://qiita.com/ChaoticActivity/items/178d23508b92a09e59ea

記事によると、サンプルを動かすためにまたいくつか手を加える必要がある(笑)


ヘッダーファイルの修正

さて、opencv_contrib-3.3.0/modules/sfm/samples以下にあるsfmのサンプルをそのままビルドしようとすると

reconstruct()が定義されていません

的なエラーが出る。
このエラーの理由は、いくつかのヘッダーファイルで

#if CERES_FOUND

という条件マクロが書かれており、Ceres-Solverの有無でincludeするファイルを選択しているから。なので、この条件がtrueになるようにコンパイラにCeres-Solverが存在することを知らせる必要がある。

で、ちょっと行儀が悪いけど、オイラはもうinclude/opencv2/sfm.hppの冒頭の以下の記述を

#ifndef __OPENCV_SFM_HPP__
#define __OPENCV_SFM_HPP__

#include <opencv2/sfm/conditioning.hpp>
#include <opencv2/sfm/fundamental.hpp>
#include <opencv2/sfm/numeric.hpp>
#include <opencv2/sfm/projection.hpp>
#include <opencv2/sfm/triangulation.hpp>
#if CERES_FOUND
#include <opencv2/sfm/reconstruct.hpp>
#include <opencv2/sfm/simple_pipeline.hpp>
#endif

直接以下のように編集しちゃいました。

#ifndef __OPENCV_SFM_HPP__
#define __OPENCV_SFM_HPP__

#include 
#include 
#include 
#include 
#include 
#include 

#define CERES_FOUND 1

#if CERES_FOUND
#include 
#include 
#endif

サンプルコードの実行

参考記事に倣ってtrajectory_reconstruccion.cppを実行してみる。

おお、特にエラーも無く動作したぞ!



サンプルコードのバグ修正

参考記事によると、このサンプルコードにはバグがあるというか、カメラの軌跡を表示する際に使用しているcv::viz::WTrajectoryに渡す引数が間違っているらしい。
以下の部分を

/// Recovering cameras
  cout << "Recovering cameras ... ";

  vector<Affine3d> path_est;
  for (size_t i = 0; i < Rs_est.size(); ++i)
    path_est.push_back(Affine3d(Rs_est[i],ts_est[i]));

  cout << "[DONE]" << endl;

逆行列に変えて以下のようにすると正しい座標変換になる。

/// Recovering cameras
  cout << "Recovering cameras ... ";

  vector<Affine3d> path_est;
  for (size_t i = 0; i < Rs_est.size(); ++i)
    path_est.push_back(Affine3d(Rs_est[i], ts_est[i]).inv());

  cout << "[DONE]" << endl;

別のサンプルコード

調子に乗ってscene_reconstruction.cppも動かしてみようと思ったら見事エラー…
http://docs.opencv.org/3.3.0/d4/d18/tutorial_sfm_scene_reconstruction.html

え、正しいコマンドライン引数が良く分からんぞ。。。

関連記事

MRenderUtil::raytrace

Raspberry PiでIoTごっこ

OpenMayaのPhongShaderクラス

顔検出・認識のAPI・ライブラリ・ソフトウェアのリスト

Alice Vision:オープンソースのPhotogram...

Unity ARKitプラグインサンプルのドキュメントを読む

疑似3D写真が撮れるiPhoneアプリ『Seene』がアップ...

OpenMVS:Multi-View Stereoによる3次...

CGのためのディープラーニング

Math.NET Numerics:Unityで使える数値計...

OpenCV バージョン4がリリースされた!

手を動かしながら学ぶデータマイニング

Google Colaboratoryで遊ぶ準備

Swark:コードからアーキテクチャ図を作成できるVSCod...

python-twitterで自分のお気に入りを取得する

立体視を試してみた

RSSフィードを読込んで表示するWordpressプラグイン...

Pythonの自然言語処理ライブラリ『NLTK(Natura...

Mitsuba 2:オープンソースの物理ベースレンダラ

ドットインストールのWordPress入門レッスン

Unityで学ぶC#

このブログのデザインに飽きてきた

Mean Stack開発の最初の一歩

AndroidもopenGLも初心者さ (でもJavaは知っ...

SSD (Single Shot Multibox Dete...

動的なメモリの扱い

今年もSSII

Raspberry Pi

定数

WinSCP

PSPNet (Pyramid Scene Parsing ...

Unityで画面タッチ・ジェスチャ入力を扱う無料Asset『...

Unityの各コンポーネント間でのやり取り

Google XML Sitemap Generatorプラ...

Blender 2.8がついに正式リリース!

TensorFlowでCGを微分できる『TensorFlow...

OpenFace:Deep Neural Networkによ...

html5のcanvasの可能性

Unityの薄い本

OpenCVの超解像(SuperResolution)モジュ...

Multi-View Environment:複数画像から3...

Structure from Motion (多視点画像から...

コメント