使い方
cv::Mat_<double> mat = (cv::Mat_<double>(3, 2) <<
1.23, 1.23,
1.23, 1.23,
1.23, 1.23);
writeTxt("mat.txt", mat);
readTxt("mat.txt", mat);
フォーマット
行列の要素を見た目のままの配列で保存する.
- ヘッダー無し
- 列:スペース区切り
- 行:改行区切り
1.23 1.23 1.23 1.23 1.23 1.23
必要なヘッダファイル
だぶんこれで全部だと思う.
#include <opencv2/opencv.hpp> #include <boost/algorithm/string.hpp> #include <boost/lexical_cast.hpp> #include <boost/format.hpp> #include <fstream>
データの保存
フォーマットがシンプルなので特別な処理は何もない.
template<typename Type>
bool writeTxt(const std::string filename, const cv::Mat_<Type> & mat)
{
using std::string;
string line;
std::ofstream ofs(filename.c_str());
if(!ofs)
{
std::cout << boost::format(" cannot open %s\n") % filename;
return false;
}
for(int j=0; j<mat.rows; j++)
{
for(int i=0; i<mat.cols; i++)
{
ofs << mat(j, i);
if(i < mat.cols - 1) ofs << " ";
if(i == mat.cols - 1) ofs << "\n";
}
}
return true;
}
データの読み込み
読み込み時は,行列の行数に応じてcv::Mat_のサイズを変える必要があるのでpush_backを使う.
列数も同様のboost::splitとboost::lexical_castを使う.
template<typename Type>
bool readTxt(const std::string filename, cv::Mat_<Type> & mat)
{
using std::string;
string line;
std::ifstream ifs(filename.c_str());
if(!ifs)
{
std::cout << boost::format(" cannot open %s\n") % filename;
return false;
}
mat = cv::Mat_<Type>();
while( getline(ifs, line))
{
boost::trim(line);
std::list<std::string> results;
boost::split(results, line, boost::is_any_of(" \t"),
boost::token_compress_on);
cv::Mat_<Type> row(1, results.size());
std::list<std::string>::iterator iter = results.begin();
std::list<std::string>::iterator tail = results.end();
for(int i=0; iter != tail; ++iter, i++)
{
row(i) = boost::lexical_cast<Type>(*iter);
}
mat.push_back(row);
}
return true;
};
課題
- 高速化
- エラー処理
- XML/YAML形式でのデータ保存/読み込み方法
http://opencv.jp/opencv2-x-samples/xml_yaml