PointCloudConsortium > PCCブログ

PCL、3D関連の情報をブログ形式で発信します。

PCLでPCDデータを読み込み可視化

前回の記事ではPCLでデプスセンサーからの点群情報を可視化、PCDデータとして保存するところまで紹介いたしました。 今回は前回保存したPCDデータを読み込み可視化する方法を紹介したいと思います。
Windows8.1でPCLを動かすまで(初心者編①)… インストール方法
Windows8.1でPCLを動かすまで(初心者編②)… VC++初期設定
Windows8.1でPCLを動かすまで(初心者編③)… PCLインクルード
PCLでデプスセンサー(Xtion)から点群情報を取得し可視化 … 点群情報の取得
PCLで点群データにデプスセンサーからの色情報を追加 … 色情報の取得
PCLで取得した点群データをPCDデータとして保存 … PCDデータ保存

■PCDデータを読み込み可視化

<1>PCDデータを用意
前回の記事で保存したPCDデータを用意します。
PCDデータを用意できない場合はPCL公式サイトのMedia/「PCL Tutorial at IROS 2011」よりダウンロードすることができます。(ページ最下段の「data」からダウンロード)

<2>サンプルコードをコピペ
PCL公式サイトのDocumentation/Tutorials/Visualizationの「The CloudViewer」ページよりサンプルコードをコピペします。

#include "stdafx.h"
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
    
int user_data;
    
void 
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);
    pcl::PointXYZ o;
    o.x = 1.0;
    o.y = 0;
    o.z = 0;
    viewer.addSphere (o, 0.25, "sphere", 0);
    std::cout << "i only run once" << std::endl;
    
}
    
void 
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
    static unsigned count = 0;
    std::stringstream ss;
    ss << "Once per viewer loop: " << count++;
    viewer.removeShape ("text", 0);
    viewer.addText (ss.str(), 200, 300, "text", 0);
    
    //FIXME: possible race condition here:
    user_data++;
}
    
int 
main ()
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("pcd_data.pcd", *cloud);
    
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    
    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);
    
    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer
    
    //This will only get called once
    viewer.runOnVisualizationThreadOnce (viewerOneOff);
    
    //This will get called once per visualization iteration
    viewer.runOnVisualizationThread (viewerPsycho);
    while (!viewer.wasStopped ())
    {
    //you can also do cool processing here
    //FIXME: Note that this is running in a separate thread from viewerPsycho
    //and you should guard against race conditions yourself...
    user_data++;
    }
    return 0;
}
これまで同様に1行目に#include “stdafx.h”を追記します。
39行目「pcl::io::loadPCDFile (“my_point_cloud.pcd”, *cloud);」の「”my_point_cloud.pcd”」を自分で制作したPCDデータのパスとファイル名に変更します。
(パスは.cppが置かれている場所から相対で追っていくか、絶対パスで記述します)
ちなみにPCDデータ容量により読み込みに時間がかかり正常に動いてないように感じることがあるかもしれません。 私は何度も引っかかってしまいました。。。
エラー表示がなければ気長に待つと表示されると思います。
上記のように表示されるかと思います。
画像の左側にある球体は17行目の記述で「sphere」球を生成しているためです。
またカウントされている経過時間の数値は22行~33行目までの記述によるものです。


ここまでのブログ記事でPCLのインストール、設定を行いデプスセンサーから情報を取得・可視化・保存を行い保存したPCDデータを可視化するまでの一連の流れを紹介いたしました。
各機能につきましては機会があれば都度紹介していきたいと思います。
まずはここまででPCL導入の一区切りとしたいと思います。

マグネットインダストリー
西内伸太郎

2014年8月25日

本コンソーシアムに関するお問合せ、PCL・3D関連のご相談はお問合せフォームよりご連絡ください。

  • PointCloudLibrary
  • エス計画
  • マグネットインダストリー
  • DERiVE
Copyright (C) 2014 PointCloudConsortium All Rights Reserved.