PointCloudConsortium > PCCブログ

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

PCLで取得した点群データをPCDデータとして保存

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

■点群データをPCD形式で保存

<1>前回使用したサンプルコード
前回の記事で紹介しましたサンプルコード。
#include "stdafx.h"
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>

 class SimpleOpenNIViewer
 {
   public:
     SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
         viewer.showCloud (cloud);
     }

     void run ()
     {
       pcl::Grabber* interface = new pcl::OpenNIGrabber();

       boost::function<void (const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr&)> f =
         boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);

       interface->registerCallback (f);

       interface->start ();

       while (!viewer.wasStopped())
       {
         boost::this_thread::sleep (boost::posix_time::seconds (1));
       }

       interface->stop ();
     }

     pcl::visualization::CloudViewer viewer;
 };

 int main ()
 {
   SimpleOpenNIViewer v;
   v.run ();
   return 0;
 }

<2>PCDデータ保存用のコードを追加

#include "stdafx.h"
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>

#include <pcl/io/pcd_io.h> //pcd_io.hをインクルード
 
 class SimpleOpenNIViewer
 {
   public:
     SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}
 
     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
         viewer.showCloud (cloud);
	   //--------------------------------------------「S」キーを押すとPCDデータを保存
	   if(GetAsyncKeyState('S')){
			pcl::io::savePCDFileASCII ("保存先のパス/pcd_data.pcd" , *cloud);
		}
     }
 
     void run ()
     {
       pcl::Grabber* interface = new pcl::OpenNIGrabber();
 
       boost::function<void (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f =
         boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);
 
       interface->registerCallback (f);
 
       interface->start ();
 
       while (!viewer.wasStopped())
       {
         boost::this_thread::sleep (boost::posix_time::seconds (1));
       }
 
       interface->stop ();
     }
 
     pcl::visualization::CloudViewer viewer;
 };
 
 int main ()
 {
   SimpleOpenNIViewer v;
   v.run ();
   return 0;
 }
上記コードの5行目に「pcd_io.h」のインクルードを指定。
17行~19行目までに「S」キーを押したときにPCDデータを保存するコードを記述します。
「保存先のパス」部分に保存先のパスを記述して「pcd_data.pcd」を保存します。
ここでは後々の処理を考えてASCIIデータで保存するように「savePCDFileASCII」と指定しています。バイナリデータで保存する場合は「savePCDFileBinary」とすると保存することができます。


次の記事では今回保存したPCDデータをPCLで可視化する方法を紹介します。

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

2014年8月7日

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

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