PCL初接触

这两天由于要做稀疏的点云重建,接触到了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的版本号。

CMake configure result

然后点上grouped和advanced,然后pcl需要的第三方库就列好了在下面。

CMake groupped and advanced variables

对于cmake可能不一定能自动找到第三库的位置,下面自己就一个个的看看。我这边其他的没有问题就是qt跟vtk有了点问题,qt没有安装默认位置,vtk具体配置按照官网给的在vtk安装目录下找到VTKConfig.cmake,在这个里面添加SET(VTK_DIR "${VTK_INSTALL_PREFIX}/lib/vtk-5.8")然后重新点一下configure,具体大致如下图:

VTK

另外vtk的可视化模块还是禁用的,打开,具体大致如下:

VTK found, enable visualization

最后在C:\PCL目录下打开PCL.sln

image

然后我编译了一下all_build的debugrelease版,然后编译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 <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>

int main ()
{	
	//pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
	//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 
	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中的。

image

另外在vs中编译生成的时候,要将所有的第三方的函数的包含文件跟库文件加入以及PCL自己的,另外在项目生成的时候在在[链接器 LINKER]的[输入INPUT]中,为项目的Debug配置增加 [附加依赖项 Additional Dependencies]也要添加lib。添加为按需添加。

原文地址:https://www.cnblogs.com/fengbing/p/2847719.html