指定桁数&指数表記なしで整数・小数を適切に表示する方法
電卓等、数字の表示可能な桁数が限られる中で、適切に数字を表示したい場合の方法。
DecimalFormat decimalFormat1_ = new DecimalFormat("0.0000000E0"); DecimalFormat decimalFormat2_ = new DecimalFormat("0.#######"); String numberStr = decimalFormat2_.format(Double.parseDouble(decimalFormat1_.format(number)));
PCL の Verbosity Level
PCLのAPIが処理途中に出力するログはどれぐらい出力するか設定を変えられる。
全モードを試してみるコードのメモ。
#include <iostream> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/console/print.h> void doSomething() { pcl::PointCloud<pcl::PointXYZ> cloud; pcl::io::loadPCDFile("not_exist.pcd", cloud); } void main() { std::cout << "\nALWAYS:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_ALWAYS); doSomething(); std::cout << "\nERROR:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_ERROR); doSomething(); std::cout << "\nWARN:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_WARN); doSomething(); std::cout << "\nINFO:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_INFO); doSomething(); std::cout << "\nDEBUG:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_DEBUG); doSomething(); std::cout << "\nVERBOSE:"; pcl::console::setVerbosityLevel(pcl::console::VERBOSITY_LEVEL::L_VERBOSE); doSomething(); std::system("pause"); }
続・PCDファイルの保存読込速度・サイズ比較
1つ前の記事で、点群データ(pcl::PointXYZ)に関して保存読込速度とサイズ比較をした。
最後のまとめで、特徴量記述子については違う結果になるかもと予想したが、せっかくなので今回実際に比較してみた。
続きを読むPCDファイルの保存読込速度・サイズ比較
ポイントクラウドの保存関数(PCD形式)は下記の3通りがある。
- pcl::io::savePCDFileASCII
- 全部テキスト形式で保存
- pcl::io::savePCDFileBinary
- ヘッダはテキスト形式で、データ部分はバイナリ形式で保存
- pcl::io::savePCDFileBinaryCompressed
- ヘッダはテキスト形式で、データ部分はLZF形式で圧縮保存
- LZF形式は圧縮率は低いが圧縮・展開が高速らしい
ちなみに pcl::io::savePCDFile という関数もあるが、この関数では引数でASCIIかBinaryかを選択する。何も指定しないとASCIIになる。
読込に関してはどの形式で保存してもすべて pcl::io::loadPCDFile という関数で可能。
保存読込速度・ファイルサイズ比較
以上の3つの方法について、保存・読込速度とファイルサイズを下記のコードで比較した。
PCL1.7.2で一部のライブラリがエラーLNK1189でビルドできない問題の対処
PCLのビルド中にpcl_featureについては下記のようなエラーメッセージが出て使えなくなってしまった。
fatal error LNK1189: オブジェクトまたはメンバーの数がライブラリの最大許容数 65535 を超えています。
調べたところ下記のページが見つかった。被害者の共通点は Visual Studio を使っていること。
- Link error 1189 library limit of 65535 objects exceeded · Issue #833 · PointCloudLibrary/pcl · GitHub
- Point Cloud Library (PCL) Users mailing list - PCL Features Library Limit Exceeded
Visual Studio のコンパイラはライブラリ内のメンバー数に制限を課しているそう。
この問題を回避するには『PCLビルド時の PCL_ONLY_CORE_POINT_TYPES をONにして、pcl_featureのメンバーを減らす』しか方法がないそう。
ただし、これを行うとpcl::PointNormal等の一部のポイントタイプが、今まで通りには使えなくなる。
というわけで、以下では
- LNK1189エラーの解消方法
- 今まで通りにポイントタイプを使うための方法
をメモ。
LNK1189エラーの解消方法
- cmake-gui で PCL_ONLY_CORE_POINT_TYPES を ON にする
- Configure を押す
- Generate を押す
- 生成された PCL.sln を開いて ALL_BUILD する
- クリーン・リビルドする必要はなく、単純にビルドでよい
今まで通りにポイントタイプを使うための方法
- 今まで作ったプロジェクトに PCL_NO_PRECOMPILE マクロを定義する
CMakeLists.txt内に書いておきたい場合:
add_definitions(-DPCL_NO_PRECOMPILE)
ソースファイル内に書いておきたい場合:
#define PCL_NO_PRECOMPILE
動作確認
下記のコードの PointT, NormalT の typedef を自分が使いたいポイントタイプに書き換えて、1,2行目のコメントを入れ替えて実行してみる。