当前位置:首页 > 操作系统 > Windows

PCL 1.60 +windows+vs2010 安装与配置

PCL简介

  PCLPoint Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在WindowsLinuxAndroidMac OS X、部分嵌入式实时系统上运行。如果说OpenCV2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCLBSD授权方式,可以免费进行商业和学术应用。

最近刚接触PCL,发现用到PCL的人还是比较少,可供学习的资料也不多,所以,我想从头开始学习,并记录下学习的过程。如果有兴趣一起学习的同学可以加我QQ761551935,我们一起交流学习。

学习资源:

PCL 1.8.0 比较全的安装包及安装步骤:http://unanancyowen.com/en/pcl18/

PCL 相关资料汇总:https://github.com/neilgu00365/Survey-for-SfMMission

PCL 中国点云库:http://www.pclcn.org/

 

环境:windows+vs2010

如果你没有vs2010我给你分享一个安装包链接:http://pan.baidu.com/s/1pL3I0dH 密码:a53o

一、下载

我用的是PCL 1.6.0 All-In-One Installer,Windows MSVC 2010 (32bit),所以,下面是以这个版本为主。其实,只要下载PCL-1.6.0-AllInOne-msvc2010-win32.exeOpenNI 1.5.4 (patched)Sensor 5.1.0 (patched)三个文件就可以了,PCL-1.6.0-AllInOne-msvc2010-win32.exe内部已经包含了全部的依赖库,安装的过程中,OpenNI会安装不上,所以要单独下载,其它的依赖库都可以不用下载。

二、安装

分别安装

1、PCL-1.6.0-AllInOne-msvc2010-win32.exe

2、OpenNI-Win32-1.5.4-Dev.msi

3、Sensor-Win-OpenSource32-5.1.0.msi

注意:你要编译的是Win32Win64的版本要区别开,PCL和依赖库都统一用同一个版本的,否则运行的时候会报错。

三、配置

 技术分享

1、配置包含路径

PCL安装路径下的3rdParty目录下的include添加进去,另外OpenNI单独安装的路径也添加进去,还有PCL安装路径下的Includepcl-1.6也添加进去。

 技术分享

2、配置库路径

PCL安装路径下的3rdParty目录下的lib添加进去,另外OpenNI单独安装的路径也添加进去,还有PCL安装路径下的lib也添加进去。

 技术分享

3、配置输入库文件

添加下列文件名

            <span>opengl32.lib

pcl_apps_debug.lib

pcl_common_debug.lib

pcl_features_debug.lib

pcl_filters_debug.lib

pcl_io_debug.lib

pcl_io_ply_debug.lib

pcl_kdtree_debug.lib

pcl_keypoints_debug.lib

pcl_octree_debug.lib

pcl_registration_debug.lib

pcl_sample_consensus_debug.lib

pcl_search_debug.lib

pcl_segmentation_debug.lib

pcl_surface_debug.lib

pcl_tracking_debug.lib

pcl_visualization_debug.lib

flann_cpp_s</span>-<span>gd.lib

boost_chrono</span>-vc100-mt-gd-<span>1_49.lib

boost_date_time</span>-vc100-mt-gd-<span>1_47.lib

boost_date_time</span>-vc100-mt-gd-<span>1_49.lib

boost_filesystem</span>-vc100-mt-gd-<span>1_47.lib

boost_filesystem</span>-vc100-mt-gd-<span>1_49.lib

boost_graph</span>-vc100-mt-gd-<span>1_49.lib

boost_graph_parallel</span>-vc100-mt-gd-<span>1_49.lib

boost_iostreams</span>-vc100-mt-gd-<span>1_47.lib

boost_iostreams</span>-vc100-mt-gd-<span>1_49.lib

boost_locale</span>-vc100-mt-gd-<span>1_49.lib

boost_math_c99</span>-vc100-mt-gd-<span>1_49.lib

boost_math_c99f</span>-vc100-mt-gd-<span>1_49.lib

boost_math_tr1</span>-vc100-mt-gd-<span>1_49.lib

boost_math_tr1f</span>-vc100-mt-gd-<span>1_49.lib

boost_mpi</span>-vc100-mt-gd-<span>1_49.lib

boost_prg_exec_monitor</span>-vc100-mt-gd-<span>1_49.lib

boost_program_options</span>-vc100-mt-gd-<span>1_49.lib

boost_random</span>-vc100-mt-gd-<span>1_49.lib

boost_regex</span>-vc100-mt-gd-<span>1_49.lib

boost_serialization</span>-vc100-mt-gd-<span>1_49.lib

boost_signals</span>-vc100-mt-gd-<span>1_49.lib

boost_system</span>-vc100-mt-gd-<span>1_47.lib

boost_system</span>-vc100-mt-gd-<span>1_49.lib

boost_thread</span>-vc100-mt-gd-<span>1_47.lib

boost_thread</span>-vc100-mt-gd-<span>1_49.lib

boost_timer</span>-vc100-mt-gd-<span>1_49.lib

boost_unit_test_framework</span>-vc100-mt-gd-<span>1_49.lib

boost_wave</span>-vc100-mt-gd-<span>1_49.lib

boost_wserialization</span>-vc100-mt-gd-<span>1_49.lib

libboost_chrono</span>-vc100-mt-gd-<span>1_49.lib

libboost_date_time</span>-vc100-mt-gd-<span>1_47.lib

libboost_date_time</span>-vc100-mt-gd-<span>1_49.lib

libboost_filesystem</span>-vc100-mt-gd-<span>1_47.lib

libboost_filesystem</span>-vc100-mt-gd-<span>1_49.lib

libboost_graph_parallel</span>-vc100-mt-gd-<span>1_49.lib

libboost_iostreams</span>-vc100-mt-gd-<span>1_47.lib

libboost_iostreams</span>-vc100-mt-gd-<span>1_49.lib

libboost_locale</span>-vc100-mt-gd-<span>1_49.lib

libboost_math_c99</span>-vc100-mt-gd-<span>1_49.lib

libboost_math_c99f</span>-vc100-mt-gd-<span>1_49.lib

libboost_math_tr1</span>-vc100-mt-gd-<span>1_49.lib

libboost_math_tr1f</span>-vc100-mt-gd-<span>1_49.lib

libboost_mpi</span>-vc100-mt-gd-<span>1_49.lib

libboost_prg_exec_monitor</span>-vc100-mt-gd-<span>1_49.lib

libboost_program_options</span>-vc100-mt-gd-<span>1_49.lib

libboost_random</span>-vc100-mt-gd-<span>1_49.lib

libboost_regex</span>-vc100-mt-gd-<span>1_49.lib

libboost_serialization</span>-vc100-mt-gd-<span>1_49.lib

libboost_signals</span>-vc100-mt-gd-<span>1_49.lib

libboost_system</span>-vc100-mt-gd-<span>1_47.lib

libboost_system</span>-vc100-mt-gd-<span>1_49.lib

libboost_test_exec_monitor</span>-vc100-mt-gd-<span>1_49.lib

libboost_thread</span>-vc100-mt-gd-<span>1_47.lib

libboost_thread</span>-vc100-mt-gd-<span>1_49.lib

libboost_timer</span>-vc100-mt-gd-<span>1_49.lib

libboost_unit_test_framework</span>-vc100-mt-gd-<span>1_49.lib

libboost_wave</span>-vc100-mt-gd-<span>1_49.lib

libboost_wserialization</span>-vc100-mt-gd-<span>1_49.lib

vtkalglib</span>-<span>gd.lib

vtkCharts</span>-<span>gd.lib

vtkCommon</span>-<span>gd.lib

vtkDICOMParser</span>-<span>gd.lib

vtkexoIIc</span>-<span>gd.lib

vtkexpat</span>-<span>gd.lib

vtkFiltering</span>-<span>gd.lib

vtkfreetype</span>-<span>gd.lib

vtkftgl</span>-<span>gd.lib

vtkGenericFiltering</span>-<span>gd.lib

vtkGeovis</span>-<span>gd.lib

vtkGraphics</span>-<span>gd.lib

vtkhdf5</span>-<span>gd.lib

vtkHybrid</span>-<span>gd.lib

vtkImaging</span>-<span>gd.lib

vtkInfovis</span>-<span>gd.lib

vtkIO</span>-<span>gd.lib

vtkjpeg</span>-<span>gd.lib

vtklibxml2</span>-<span>gd.lib

vtkmetaio</span>-<span>gd.lib

vtkNetCDF</span>-<span>gd.lib

vtkNetCDF_cxx</span>-<span>gd.lib

vtkpng</span>-<span>gd.lib

vtkproj4</span>-<span>gd.lib

vtkRendering</span>-<span>gd.lib

vtksqlite</span>-<span>gd.lib

vtksys</span>-<span>gd.lib

vtktiff</span>-<span>gd.lib

vtkverdict</span>-<span>gd.lib

vtkViews</span>-<span>gd.lib

vtkVolumeRendering</span>-<span>gd.lib

vtkWidgets</span>-<span>gd.lib

vtkzlib</span>-gd.lib

技术分享

文件有点多,这里可以有个比较快的方法:这里以vtk为例,

打开CMD->进入PCL的安装目录->进入3rdPartyVTKlibvtk-5.8目录->输入命令:dir /b *gd.lib -> list.txt

命令的意思是找出gd.lib结尾的文件并保存到list.txt文档里面。然后当前目录就会生成list.txt

 技术分享

 

四、Demo

例程:  

#include <pcl/visualization/cloud_viewer.h><span>
#include </span><iostream><span>
#include </span><pcl/io/io.h><span>
#include </span><pcl/io/pcd_io.h>

<span>int</span><span> user_data;


</span><span>void</span> viewerOneOff (pcl::visualization::PCLVisualizer&<span> viewer)
{
    viewer.setBackgroundColor (</span><span>0</span>, <span>0</span>, <span>0</span><span>);
    pcl::PointXYZ o;
    o.x </span>= <span>1.0</span><span>;
    o.y </span>= <span>0</span><span>;
    o.z </span>= <span>0</span><span>;
    viewer.addSphere (o, </span><span>0.25</span>, <span>"</span><span>sphere</span><span>"</span>, <span>0</span><span>);
    std::cout </span><< <span>"</span><span>i only run once</span><span>"</span> <<<span> std::endl;

}

</span><span>void</span> viewerPsycho (pcl::visualization::PCLVisualizer&<span> viewer)
{
    </span><span>static</span> unsigned count = <span>0</span><span>;
    std::stringstream ss;
    ss </span><< <span>"</span><span>Once per viewer loop: </span><span>"</span> << count++<span>;
    viewer.removeShape (</span><span>"</span><span>text</span><span>"</span>, <span>0</span><span>);
    viewer.addText (ss.str(), </span><span>200</span>, <span>300</span>, <span>"</span><span>text</span><span>"</span>, <span>0</span><span>);

    </span><span>//</span><span>FIXME: possible race condition here:</span>
    user_data++<span>;
}

</span><span>int</span><span> main ()
{
    pcl::PointCloud</span><pcl::PointXYZRGBA>::Ptr cloud (<span>new</span> pcl::PointCloud<pcl::PointXYZRGBA><span>);
    pcl::io::loadPCDFile (</span><span>"</span><span>my_point_cloud.pcd</span><span>"</span>, *<span>cloud);

    pcl::visualization::CloudViewer viewer(</span><span>"</span><span>Cloud Viewer</span><span>"</span><span>);

    
    </span><span>//</span><span>blocks until the cloud is actually rendered</span><span>    viewer.showCloud(cloud);

    </span><span>//</span><span>use the following functions to get access to the underlying more advanced/powerful
    </span><span>//</span><span>PCLVisualizer

    </span><span>//</span><span>This will only get called once</span><span>    viewer.runOnVisualizationThreadOnce (viewerOneOff);

    </span><span>//</span><span>This will get called once per visualization iteration</span><span>    viewer.runOnVisualizationThread (viewerPsycho);
    </span><span>while</span> (!<span>viewer.wasStopped ())
    {
        </span><span>//</span><span>you can also do cool processing here
        </span><span>//</span><span>FIXME: Note that this is running in a separate thread from viewerPsycho
        </span><span>//</span><span>and you should guard against race conditions yourself...</span>
        user_data++<span>;
    }
    </span><span>return</span><span>0</span><span>;
}</span>

技术分享

以上效果图是用realsenseSR300获取到我桌面的点云。

my_point_cloud.pcd 文件 链接:http://pan.baidu.com/s/1gfD2lF1 密码:cexi

五、总结分享

1、pcd读取有点慢,据说pcd数据以有序点云的方式保存会好一点,但是没我试了没看出来能快多少,这个有待研究。

2、SR300直接获取的深度图像和RGB图像坐标上有偏差,这个考虑下怎么做对齐。

3、如果工程配置上SR300SDKopencv,我们就不需要在另一个工程先保存pcd文件再读取,中间就可以省了很多步骤。

4、PCL的学习资料还是很少,目前听说比较好也就只有《点云库PCL学习教程》,我也买了一本,慢慢学吧。

 

原文:http://www.cnblogs.com/chensheng-zhou/p/7773643.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐