这两天由于要做稀疏的点云重建,接触到了PCL(Point Cloud Library),看了看网上的教程,在官网http://pointclouds.org/downloads/windows.html 我是在windows下的,由于以后应该会研究里面的源码,于是就没有安装预编译版All-in-one installers,而是自己编译了一份,具体编译过程参考官网, 这边大概说下。
我用的是XP系统普通双核非i系列32位,显卡一般256M,不支持CUDA,OpenCL,IDE是VS2008。
1、先前工作
首先要安装第三方库。下载的时候根据自己的配置选择
MSVC 2008 (32bit),MSVC 2010 (32bit),MSVC 2008 (64bit),MSVC 2010 (64bit)
boost,Eigen(线性算术的C++模板库),FLANN,VTK这几个是必须的,对于下面的应该是可以选择安装,我是都装上了。Qt,QHull(三维凸包),OpenNI,GTest。
直接在官网下载安装,安装之后,系统环境变量都已经配好了。
如果安装了Qt的话,Qt的环境变量貌似没有配,这个我自己配的,还有这个Qt安装要安装在默认位置,我安装D盘后,cmake找不到,不知道是不是没有安装默认位置的原因,后来我改成了默认位置好了。具体定义一个环境变量QTDIR C:\Qt\4.8.0 然后把bin目录加到path下面。
2、下载源码
这个可以直接在官网下载好的http://pointclouds.org/downloads/ 或者用svn,我直接下载了PCL 1.6.0 (2012.07.17)然后解压,我也一样解压到了C盘
C:\PCL\trunk。然后打开cmake2.8以上版本。把cmakelist拖进来,具体显示如下:另外点configure配置的时候,选择你vs的版本号。
然后点上grouped和advanced,然后pcl需要的第三方库就列好了在下面。
对于cmake可能不一定能自动找到第三库的位置,下面自己就一个个的看看。我这边其他的没有问题就是qt跟vtk有了点问题,qt没有安装默认位置,vtk具体配置按照官网给的在vtk安装目录下找到VTKConfig.cmake,在这个里面添加SET(VTK_DIR "${VTK_INSTALL_PREFIX}/lib/vtk-5.8")然后重新点一下configure,具体大致如下图:
另外vtk的可视化模块还是禁用的,打开,具体大致如下:
最后在C:\PCL目录下打开PCL.sln
然后我编译了一下all_build的debug 和 release版,然后编译install的debug 和 release版,最终默认在c盘program files目录下面有PCL目录。这个时间比较长,我总耗时大概5小时多,电脑好的话,应该会快很多。
在编译all——build下debug版的时候出现如下错误
错误 27803 error C2872: “uint32_t”: 不明确的符号 c:\PCL\trunk\tools\mls_smoothing.cpp 104 pcl_mls_smoothing
错误 27822 error C2061: 语法错误 : 标识符“uint32_t” c:\PCL\trunk\tools\mesh_sampling.cpp 121 pcl_mesh_sampling
错误 28197 error C2872: “uint32_t”: 不明确的符号 c:\PCL\trunk\tools\gp3_surface.cpp 96 pcl_gp3_surface
修改为unsigned int 或者修改为boost::uint32_t,我修改成unsigned int ,编译成功。
另外对于编译release版的时候也报错了,类似于
general error c101008d: Failed to write the updated manifest to the resource of file "。
这个把杀毒软件关了就可以了,具体原因别人写的。
由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件发现这个EXE,DLL正在读写),于是VC就写不进去了,方法是暂时关闭杀毒软件,这样就不用改写MANIFECT。
然后整个pcl库就编译安装完成。然后做个测试,下面就看看源码。
#include
#include
int main ()
{
//pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
//pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
pcl::io::loadPCDFile("pcl_logo.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//显示
viewer.showCloud(cloud);
while (!viewer.wasStopped ())
{
}
return 0;
}
仅仅是简单的显示点云,可以使用CloudViewer类。这个类非常简单易用。但要注意,它不是线程安全的。如果要用于多线程,还要参考PCLVisualizer。
需要注意的是,PointCloud的数据类型要和PCD文件中或者代码中的PointT一致!上面的代码中给出了三种。最终结果如下,pcd用的是test中的。
另外在vs中编译生成的时候,要将所有的第三方的函数的包含文件跟库文件加入以及PCL自己的,另外在项目生成的时候在在[链接器 LINKER]的[输入INPUT]中,为项目的Debug配置增加 [附加依赖项 Additional Dependencies]也要添加lib。添加为按需添加。