PCLでOBJファイルを表示(点群のみ)
PCLのチュートリアルでは点群データのファイル拡張子として.pcdを使っていますが,.pcdでない既存のファイルからも点群データを読み込んで表示したいという需要は大いにあると思います.例えば.objとか.stlとか.成功したコードを2通り載せておきます.他にも見つかったら追記しようと思います.
なお,ここでは.objファイルとしてMMD標準モデルとして有名な「あにまさ式ミク」を利用します.元データは.pmdですが,.objファイルにしてくれた先人がいたので利用させてもらいます.感謝感激雨霰.
第一の方法:PolygonMesh→PointCloud
.objファイルはPCLで読み込むとpcl::PolygonMesh
型となります.これは直接pcl::Visualization::CloudViewer
で開くことができないので,pcl::PointCloud<T>
型に変換してからCloudViewerに渡します.なおソースコード中のPCLAdapter.h
については以前の記事を参照のこと.
ちなみにpcl::io::loadPolygonFileOBJ
をpcl::io::loadPolygonFileSTL
に変更すれば.stlファイルも読み込めます.
#include "PCLAdapter.h" const char filename[] = "model/miku.obj"; int main(void) { // OBJファイルを読み込む pcl::PolygonMesh::Ptr mesh(new pcl::PolygonMesh()); pcl::PointCloud<pcl::PointXYZ>::Ptr obj_pcd(new pcl::PointCloud<pcl::PointXYZ>()); if (pcl::io::loadPolygonFileOBJ(filename, *mesh) != -1) { // PolygonMesh -> PointCloud<PointXYZ> pcl::fromPCLPointCloud2(mesh->cloud, *obj_pcd); } while (!viewer.wasStopped()) { viewer.showCloud(obj_pcd); } }
第二の方法:PolygonMesh→vtkPolyData→PointCloud
なぜわざわざvtkPolyData
とかいう余計なものを間に挟むのか.まあいいじゃないか....っていう冗談はさておき.CloudViewerで物足りなくなった時に将来的にPCLVisualizerを使うことになると思います.こっちはvtkPolyData
を要求するので,この変換方法もメモとして残すためです.どうせGLFWに描かせるようにするからいらないかもしれないけど.
(2015/09/21訂正)間違い.PCLVisualizerはちゃんとPointCloudをそのまま読み込んでくれます.なのでこっちの方法はいよいよもって意味がなくなりました.
#include "PCLAdapter.h" const char filename[] = "model/miku.obj"; int main(void) { // OBJファイルを読み込む pcl::PolygonMesh::Ptr mesh(new pcl::PolygonMesh()); pcl::PointCloud<pcl::PointXYZ>::Ptr obj_pcd(new pcl::PointCloud<pcl::PointXYZ>()); if (pcl::io::loadPolygonFileOBJ(filename, *mesh) != -1) { // PolygonMesh -> vtkPolyData -> PointCloud<PointXYZ> vtkSmartPointer<vtkPolyData> vtkmesh; pcl::io::mesh2vtk(*mesh, vtkmesh); pcl::io::vtkPolyDataToPointCloud(vtkmesh, *obj_pcd); } while (!viewer.wasStopped()) { viewer.showCloud(obj_pcd); } }
結果
ミクさんの神々しい御姿が点群データとして表示できました.ちなみに,CloudViewerは既にマウスドラッグ・キー入力操作が仕込まれていますので,OpenGLのように改めてプログラムする必要はありません.キー入力の一覧はh
でコンソールにずらっと表示されます.q
もしくはe
を押すとviewer.wasStopped()
がtrueを返し終了します.
こんな感じで今後もPCLのTipsを不定期にメモ書きしていく予定.