takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

PCLのOctreeで各ノードへアクセスする場合の注意点

はまったのでメモ。
相変わらずPCLはドキュメントが少なくてしんどい。


PCLにはOctreeというモジュールがあります。これは空間を8つの立方体に再帰的に分割していくことで、八分木でVoxel空間を表すためのモジュールです。
詳しくはここを参照して下さい。

OctreeではVoxelをポイントクラウドが存在するものとそうでないものに分けて、高速にアクセスすることができます。
Octreeのチュートリアルこちらをこちらです。


この八分木の各ノードへアクセスする方法として、以下のイテレータが用意されてます。

  • pcl::octree::OctreeDepthFirstIterator< OctreeT > (深さ優先探索)
  • pcl::octree::OctreeBreadthFirstIterator< OctreeT > (幅優先探索)
  • pcl::octree::OctreeLeafNodeIterator< OctreeT > (葉ノードへのアクセス)


で、このOctreeの各ノードにアクセスしようと、こんなコードを書いてみたんですが、

float resolution = 0.05;
pcl::octree::OctreePointCloud octree (resolution);

octree.setInputCloud (cloud_p);
octree.defineBoundingBox();
octree.addPointsFromInputCloud ();

std::cout << "Depth Count: " << octree.getTreeDepth() << std::endl;
pcl::octree::OctreePointCloud::BreadthFirstIterator bit(octree);
while(*++lit){
	std::cout << bit.getCurrentOctreeDepth() << ",";
}

これをVC++2010 (Win7)上でビルドしたところ、無事コンパイルは通るのですが、

1>main.obj : error LNK2001: 外部シンボル ""public: class pcl::octree::OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > > & __thiscall pcl::octree::OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > >::operator++(void)" (??E?$OctreeBreadthFirstIterator@HV?$OctreeBase@HV?$OctreeContainerDataTVector@H@octree@pcl@@V?$OctreeContainerEmpty@H@23@@octree@pcl@@@octree@pcl@@QAEAAV012@XZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual __thiscall pcl::octree::OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > >::~OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > >(void)" (??1?$OctreeBreadthFirstIterator@HV?$OctreeBase@HV?$OctreeContainerDataTVector@H@octree@pcl@@V?$OctreeContainerEmpty@H@23@@octree@pcl@@@octree@pcl@@UAE@XZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: __thiscall pcl::octree::OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > >::OctreeBreadthFirstIterator,class pcl::octree::OctreeContainerEmpty > >(class pcl::octree::OctreeBase,class pcl::octree::OctreeContainerEmpty > &)" (??0?$OctreeBreadthFirstIterator@HV?$OctreeBase@HV?$OctreeContainerDataTVector@H@octree@pcl@@V?$OctreeContainerEmpty@H@23@@octree@pcl@@@octree@pcl@@QAE@AAV?$OctreeBase@HV?$OctreeContainerDataTVector@H@octree@pcl@@V?$OctreeContainerEmpty@H@23@@12@@Z)" は未解決です。

というリンクエラーが出やがります。


で、ググったところこのサイトを見つけました。
このサイトに従い、

#include <pcl/octree/octree_impl.h>

を加えたら、無事ビルドできました。