ラベル Eigen の投稿を表示しています。 すべての投稿を表示
ラベル Eigen の投稿を表示しています。 すべての投稿を表示

2016年2月19日金曜日

EigenのデータをCSV形式で保存(c++)

EigenのMatrixXdのデータをCsv形式で保存したくなったので、作りました。

ソース;
--------------------------------- exportCsv.h ---------------------------------
#include <fstream>
#include <iostream>
#include <vector>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

void exportData(string filename,vector<MatrixXd> data);

--------------------------------- exportCsv.cpp ---------------------------------
#include "exportCsv.h"

void  exportData(std::string filename,vector<MatrixXd> data)
{
ofstream ofs(filename);

vector<MatrixXd>::iterator it;
for(it = data.begin(); it != data.end(); it++ )
{
for (int i = 0; i < (*it).rows(); i++)
{
ofs << (*it)(i, 0);
if (i != (*it).rows()-1) {
ofs << ",";
}

}
ofs << endl;
}

ofs.close();

return;
}

使い方:
#include "exportCsv.h"

// for export data
std::vector<MatrixXd> data;

data.push_back(pushData);

exportData("data.csv", data);



参考:
http://futurismo.biz/archives/1782

2015年7月20日月曜日

OpenCV Mat と Eigen の相互変換

覚書として。参考サイトからの引用です。



cv::MatとEigen::Matrixの相互変換

cv::MatからEigen::Matrixへの変換
#include <iostream>
#include <Eigen/Core>
#include <opencv2/core/core.hpp>
#include <opencv2/core/eigen.hpp>

int
main(int argc, char *argv[])
{
  // 3x3, double の行列
  Eigen::Matrix3d eigen_mat;
  eigen_mat << 1.1, 1.2, 1.3,
               2.1, 2.2, 2.3,
               3.1, 3.2, 3.3;
  cv::Mat cv_mat;
  // convert from Eigen::Matrix to cv::Mat
  cv::eigen2cv(eigen_mat, cv_mat);

  std::cout << "cv_mat:\n" << cv_mat << std::endl << std::endl;
  std::cout << "eigen_mat:\n" << eigen_mat << std::endl << std::endl;
}
実行結果:
cv_mat:
[1.1, 1.2, 1.3;
  2.1, 2.2, 2.3;
  3.1, 3.2, 3.3]

eigen_mat:
1.1 1.2 1.3
2.1 2.2 2.3
3.1 3.2 3.3
Eigen::Matrixからcv::Matへの変換
#include <iostream>
#include <Eigen/Core>
#include <opencv2/core/core.hpp>
#include <opencv2/core/eigen.hpp>

int
main(int argc, char *argv[])
{
  // 3x3 の行列
  cv::Mat cv_mat = (cv::Mat_<double>(3,3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
  Eigen::Matrix<double, 3, 3> eigen_mat1; // コンパイル時に行列サイズが既知の場合
  // convert from cv::Mat to Eigen::Matrix
  cv::cv2eigen(cv_mat, eigen_mat1);

  std::cout << "cv_mat:\n" << cv_mat << std::endl << std::endl;
  std::cout << "eigen_mat1:\n" << eigen_mat1 << std::endl << std::endl;

  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> eigen_mat2; // 動的な行列
  // convert from cv::Mat to Eigen::Matrix
  cv::cv2eigen(cv_mat, eigen_mat2);
  std::cout << "eigen_mat2:\n" << eigen_mat2 << std::endl << std::endl;
}
実行結果:
cv_mat:
[1, 2, 3;
  4, 5, 6;
  7, 8, 9]

eigen_mat1:
1 2 3
4 5 6
7 8 9

eigen_mat2:
1 2 3
4 5 6
7 8 9

参考
cv::Matの基本処理
http://opencv.jp/cookbook/opencv_mat.html#cv-mateigen-matrix

2015年7月1日水曜日

CMakeList.txt の設定 (Visual studio 2013 + OpenGL & OpenCV & Eigen)

cmakeをつくるのに苦労したので、その記録。初心者だー
今作っているプログラムは、OpenGL & OpenCV & Eigenを使っています。それらのCmakeの作り方はそれぞれ違っていので、いろいろと参考になるねーってことでまとめ。また、私の環境はいろいろ制限(インストール不可+特定フォルダにアクセス不可)されているので、OpenGLはふつうはこんなことしなくてもいいかも。また、この理由によりパスは私の使っているものなので、自由に変更してほしい。変更するところだけ太字にしておく。

1.OpenCV
Windowsで自前でOpenCVをコンパイルした時にはCmakeはそのフォルダをわかってくれない。そのためOpenCV_DIRで場所をしていしてあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVインストールパスを指定
set(OpenCV_DIR "C:/dev/opencv-2.4.10/build/install")

# OpenCVのパッケージを探す
find_package(OpenCV REQUIRED)

# OpenCVが見つかった場合のみ設定を行う
if(OpenCV_FOUND)
  # インクルードパスを指定
  include_directories(${OpenCV_INCLUDE_DIRS})

  # リンクするライブラリ指定
  target_link_libraries(platform ${OpenCV_LIBS})
endif(OpenCV_FOUND)

2.Eigen
Eigenはインクルードのみで使えるライブラリなのでそのパスだけを指定してあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# Eigen
include_directories("C:/dev/eigen-3.2.4")

3.OpenGL
なぜかこれをかなり苦労した。freeglutをダウンロードしてコンパイルして使っているのだが、フォルダ構成が違うせいかOpenCVと同じ方法をとっても何か上手くいかない。そのため、どうせ使うのはfreeglut.libとインクルードだけなので直接指定した。Cmakeの利点が消えている気がするがまぁいい。いつかいいことあるだろう。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVのパッケージを探す
find_package(OpenGL REQUIRED)
include_directories("D:/twatanabe8/dev/freeglut-2.8.1/include")

target_link_libraries(platform "D:/twatanabe8/dev/freeglut-2.8.1/lib/x64/freeglut.lib")

2015年5月28日木曜日

Eigen(行列演算ライブラリ)のインストール(Visual Studio 2013&2015)

Eigen は、ヘッダのみで構成される純粋なテンプレートライブラリであるため、インストール時のコンパイルが不要。

1.ダウンロード
EigenのHPからダウンロード。
http://eigen.tuxfamily.org/index.php?title=Main_Page
(私のダウンロード時点では、3.2.4が最新だったため、それを前提に以降は話す。)

2.展開
解凍するだけ。私の場合は、
C:\dev\
に回答した。理由は、スペースの入らない場所にしたかったこと。また、CmakeやらOpenCVの置く場所として使っていたこと。
また、解凍フォルダの名前は、下記とした。
eigen-3.2.4

3.パスの設定を行う。
コントロールパネル→システム→設定の変更→詳細設定→環境変数
の中の、「 システム環境変数 」の欄にある変数名「 Path 」に下記を追加。
C:¥dev¥eigen-3.2.4¥Eigen

--------------- 以降 新プロジェクトを作成する際は4を実行する--------------------
4.Visual Studioにインクルードパスを設定する。
ソリューションエクスプローラーのプロジェクトで左クリック
プロパティを開く。
構成プロパティ->C/C++->全般
の「追加のインクルードディレクトリ」に以下を追加
C:\dev\eigen-3.2.4

5.作動チェック
以下のコードをMain.cppとでもしたファイルにいれて、コンパイル。
なんか出たら成功

#include <iostream>
#include <Eigen/Dense>

int _tmain(int argc, _TCHAR* argv[])
{
Eigen::MatrixXd A(9, 9);
std::cout << A;
return 0;
}