聞きかじりめも

主にC++やメディア処理技術などに関して気付いたことを書いていきます.ここが俺のメモ帳だ!

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::loadPolygonFileOBJpcl::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);
    }
}

結果

f:id:Mzawa2:20150908230037p:plain ミクさんの神々しい御姿が点群データとして表示できました.ちなみに,CloudViewerは既にマウスドラッグ・キー入力操作が仕込まれていますので,OpenGLのように改めてプログラムする必要はありません.キー入力の一覧はhでコンソールにずらっと表示されます.qもしくはeを押すとviewer.wasStopped()がtrueを返し終了します.

こんな感じで今後もPCLのTipsを不定期にメモ書きしていく予定.