一発でわかる Iterative Closest Point のコンセプト図解
2つの点群を重ね合わせる手法にICP (Iterative Closest Point) というものがあります。
1992年に発表されてから、現在に至るまであらゆる派生手法が提案されています。
ベーシックなICPの仕組みは一言で言うと「近傍点との距離の最小化を繰り返す」です。これを動画で示すと次の通りです。ちょっとずつ2つの点群の間が縮まって、最後的にぴったり合わせられるわけです。
ICPの注意点として、「初期位置合わせが必要」ということが挙げられます。言い換えると「2つの点群はある程度近い位置に配置されていないといけない」ということです。もし、初期位置合わせがされていなければ、下記の動画のように変な結果に終わってしまいます。(オレンジの破線が正しい点の対応関係を表す)
適切な初期位置合わせ+ICPで例えば次の画像のように2つの3D点群をピタッと合わせられます。
- 点群1
- 点群2
- ICP結果
Visual Studio 2013 でソリューションを開こうとするとビジーになる場合の対処
Visual Studio 2013 でソリューションを開こうとするとビジーになる場合が前からちょくちょくあったが、
今日は全く開けなくなった。何回再起動したり.suoファイルを削除したりしても治らない。
そこでちょっと調べて見つけた解決方法。私はこれで治った。
OpenCV3では視差画像が作れない?
OpenCVで視差画像を作ろうと思って調べたところ下記のサイトを発見。ちなみに2008年の情報。
Momma's Wiki: OpenCV/距離計測 - ステレオマッチング(二眼カメラ)による距離計測 ※CvCalibFilte...
これに従って、最新であるOpenCV3を使って試してみたら、cvFindStereoCorrespondence関数が未定義といって怒られる。
ちなみに、OpenCV2.4.11を使ったらできた。
OpenCV3では視差画像は作れないか、別の何かに置き換わったのかもしれない。
暇なときにOpenCV3の視差画像関連の機能を探したいと思います。
PTAMをVS2013でWebカメラ使用版に改造してビルド
PTAMビルド手順はいろんなサイトに載ってますが、100%その通りにやればビルドできたというわけではないので、そのメモ。
ビルド手順 参考サイト
上記サイトの情報に加えて必要だったこと
事前準備
- FLTK2.0はhttp://www.fltk.org/からダウンロードすると書かれているが、このサイトには1.0~1.3しかないので「fltk 2.0」等で自分で検索して見つけたほうがよい
- WebカメラでPTAMをやるのであれば「CMU 1394 camera driver」関係の手順は一切不要
- ewclib.hの中でqedit.hをincludeしているが、最近のVSにはついてないのでネット上等から持ってくる必要あり
- ewclib.h内の「#include <qedit.h>」も「#include "qedit.h"」に修正しないとダメかも
- qedit.hに下記ページに載っている修正が必要
- メッセージ ヘルプ:qedit.hの498行目でdxtrans.hがインクルードできないビルドエラーについて #42631 - 兎系映像キャプチャライブラリ WRP-VCL - OSDN
- libcvdのビルド時にstd::max, std::minが見つからないと怒られるので、cvd/utility.hに「#include <algorithm>」を追加
PTAMコンパイル
- 「Build/Win32の中のPTAM.sln、PTAM.vcproj、CameraCalibrator.vcproj、VideoSource_Win32_CMU1394.cc を PTAM フォルダ直下へコピー。」とあるが:
- PTAM.vcxproj、CameraCalibrator.vcxprojの2ファイルも必要
- VideoSource_Win32_CMU1394.ccは不要
- 2つのプロジェクト(CameraCalibrator、PTAM)それぞれのDebug、Releaseの使用libファイルからcmu1394.lib的なのを削除
- max, min関数が見つからないと怒られるので、ATANCamera.ccに「#include <algorithm>」を追加
指定桁数&指数表記なしで整数・小数を適切に表示する方法
電卓等、数字の表示可能な桁数が限られる中で、適切に数字を表示したい場合の方法。
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"); }