(注:资料来源:D:\项目资料_YC\激光扫描建模_长沙项目_2016→2019\2017&2018_文档资料_技术总结YC\201703→_YC_激光建模技术总结_201703及以后.docx)
目录
A.PCL的初步安装及测试
0、安装平台
1、VS2010的安装
2、PCL的安装
3、Cmake的安装
4、环境变量path的配置
5、采用Cmake生成测试工程
5.1 在Visual Studio2010中,新建一个.cpp文件
5.2 建立CmakeLists.txt文档
5.3建立文件夹
5.4打开Cmake软件创建工程
6、用VS2010打开工程并初步编译
7、QT安装
8、测试工程的再次编译和运行
9、附录:相关网址
B.不借助Cmake而在VS2010中调用PCL
1、在visual studio2010中新建工程
2、添加代码
3、配置目录
5、各种报错解决方案
报错1:error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记
报错2:32位PCL应在Debug 32模式下进行编译;64位PCL应在Debug x64模式下进行编译。否则会报错。
报错3:error C2661: “pcl::PointCloud::operator new”: 没有重载函数接受 3 个参数
报错4:“找不到标识符”
报错5:“result”: 符号既不是类 模板 也不是函数 模板
报错6:vs2010+pcl遇到的无法解析的外部命令
C.PCL学习网址链接
A.PCL的初步安装及测试
本节是对开源点云库PCL的安装、调试过程的总结,内容涵盖以下方面:①安装:VS2010的安装、PCL的安装、Cmake的安装;②配置:环境变量path的配置、Cmake的应用、VS2010的配置;③测试:新建一个工程,测试PCL的安装是否成功。
0、安装平台
本次安装的平台如下:
操作系统:Win7 64位操作系统
编程环境:Visual Studio 2010
PCL版本:1.6.0
1、VS2010的安装
安装包:移动硬盘里有备份(20170528)。安装包如下图所示:
![](https://img-blog.csdnimg.cn/20200309114757939.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309114757921.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
安装步骤:
安装过程中可能会出现的报错:
![](https://img-blog.csdnimg.cn/20200309114757916.jpeg)
对此问题可参考以下网址:
网址1:http://jingyan.baidu.com/article/64d05a0278f40dde55f73bf0.html
网址2:http://www.yishimei.cn/network/385.html
另,为以防万一,安装VS2010是最好关闭杀毒软件。
Visual Studio2010具体安装步骤可参考以下网址:http://jingyan.baidu.com/article/a65957f49714ad24e77f9b69.html
2、PCL的安装
备注:如果以前安装过pcl,想再安装其他版本的pcl,则可以直接安装,无需卸载之前的版本。只要路径不同就行。然后把VS里pcl相关的配置内容清除,同时也别忘了更改环境变量path中的配置。
备注:本次安装测试笔者安装的是PCL1.6.0、64位。在后续的项目使用中由于实际需求,换成了PCL1.6.0、32位的了。
PCL1.6.0、64位的安装包:移动硬盘里有备份(20170528)。安装包如下图所示:(网页下载路径:http://pointclouds.org/downloads/windows.html)
![](https://img-blog.csdnimg.cn/20200309115007552.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309115007565.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
安装步骤:
双击以下应用程序:
![](https://img-blog.csdnimg.cn/20200309115819792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
在安装的过程中,安装位置(路径)可以自定义,其余的均默认。
【注意:安装路径不要过长,否则后续程序编译会出错。】
安装过程中会跳出如下安装提示框,直接点击Install即可。
![](https://img-blog.csdnimg.cn/20200309115819687.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后跳出如下界面,点击Finish
![](https://img-blog.csdnimg.cn/20200309115819684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后跳出如下界面,直接点击Install
![](https://img-blog.csdnimg.cn/20200309115819702.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后跳出如下界面,点击Finish
![](https://img-blog.csdnimg.cn/20200309115819725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后点击“完成”
![](https://img-blog.csdnimg.cn/20200309115819730.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
安装完毕之后,在PCL 1.6.0的安装文件夹里,会有如下文件:
![](https://img-blog.csdnimg.cn/20200309115819794.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
将PCL安装包中下图所示的压缩包解压,
![](https://img-blog.csdnimg.cn/20200309115819811.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
将文件夹中的.pdb文件全部复制到PCL 1.6.0的安装文件夹的bin文件夹里。(笔者的路径:D:\PCL 1.6.0\anzhaungwenjianjia\PCL 1.6.0\bin)如下图所示:
![](https://img-blog.csdnimg.cn/20200309115819815.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
至此已完成PCL 1.6.0的安装。
3、Cmake的安装
安装包:移动硬盘里有备份(20170528)。安装包如下图所示:
![](https://img-blog.csdnimg.cn/20200309120035315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309120035327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
安装步骤:
点击Next
点击Next
点击Next
选择安装路径,之后点击Next
点击Install
点击Finish
4、环境变量path的配置
计算机右键,属性→选择左上方的 高级系统设置→跳出如下图所示的界面:
![](https://img-blog.csdnimg.cn/20200309120035265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
点击右下方的环境变量按钮,跳出如下图所示的界面:
![](https://img-blog.csdnimg.cn/20200309120035280.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
在下面的“系统变量(S)”框里选择Path,点击“编辑”按钮,
![](https://img-blog.csdnimg.cn/20200309120035272.png)
弹出编辑系统变量界面:
![](https://img-blog.csdnimg.cn/20200309120035277.png)
在该界面中,对“变量值”进行修改,为方便起见,建议将“变量值”全部复制到txt文档中进行修改,修改完之后再粘回去。
修改注意事项:①英文下输入;②路径之间用英文分号隔开;③最后一个路径之后不加分号;④添加完Path之后,有可能在重启电脑之后才生效。
在现有的“变量值”后面添加:(注意:要根据自己的实际安装路径确定添加的内容,不能直接复制下面的内容)
;D:\Cmake-3.8.1\anzhuangwenjianjia\bin;D:\PCL 1.6.0\bin;D:\PCL 1.6.0\3rdParty\FLANN\bin;D:\PCL 1.6.0\3rdParty\VTK\bin;D:\PCL 1.6.0\3rdParty\Qhull\bin
5、采用Cmake生成测试工程
5.1 在Visual Studio2010中,新建一个.cpp文件
(关于visual studio MFC的最基本使用,可参考以下教材:http://www.jizhuomi.com/software/257.html#cmt12136)
编辑一段简单的代码cloud_viewer_PointXYZ.cpp,将其在新建的工程中粘贴过去,保存。
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
intuser_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::stringstreamss;
ss<< "Once per viewer loop: " << count++;
viewer.removeShape ("text", 0);
viewer.addText (ss.str(), 200, 300, "text", 0);//test窗口的位置
//FIXME: possible race condition here:
user_data++;
}
int main ()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); //modified
//blocks until the cloud is actually rendered
if(pcl::io::loadPCDFile<pcl::PointXYZ>("my_point_cloud.pcd",*cloud)==-1)//*打开含有点云图案的pcd文件
{
PCL_ERROR("Couldn't read file my_point_cloud.pcd\n");
return(-1);
}
pcl::visualization::CloudViewer viewer("Cloud Viewer");
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++;
}
system("pause");
return 0;
}
5.2 建立CmakeLists.txt文档
建立CmakeLists.txt文档,源代码(也即该.txt文档的内容)如下:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(cloud_viewer_PointXYZ)
find_package(PCL 1.6 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (cloud_viewer_PointXYZ cloud_viewer_PointXYZ.cpp)
target_link_libraries (cloud_viewer_PointXYZ ${PCL_LIBRARIES})
再谈谈我对这段代码的理解:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)这是对cmake的最低版本要求,由于编程简单,不需要2.8或者更高的版本;
project(cloud_viewer_PointXYZ)这是cpp文件的工程名;
find_package(PCL 1.6 REQUIRED)这是对PCL的版本要求;
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})这几句是利用Cmake的宏完成对pcl的头文件路径和链接路径变量的配置和添加,若没有这几句,.cpp文件的头文件则会出现报错
add_executable (cloud_viewer_PointXYZ cloud_viewer_PointXYZ.cpp)这句是告诉我们,将把&&.cpp文件装换成另一个名为cloud_viewer_PointXYZ的可执行文件,当然,可以任意取名;
target_link_libraries (cloud_viewer_PointXYZ ${PCL_LIBRARIES})这句是将新生成的可执行文件链接到PCL库;
5.3建立文件夹
创建名为test-project的文件夹,在该文件夹里创建2个文件夹,名字分别为cmake-bin和source,如下图所示:
![](https://img-blog.csdnimg.cn/20200309121028521.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后,将刚才所建立的CmakeLists.txt文档和cloud_viewer_PointXYZ.cpp文档复制到source文件夹内。
5.4打开Cmake软件创建工程
将前面所建立的2个文件夹路径设置在Cmake界面内:
![](https://img-blog.csdnimg.cn/20200309121028522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
↓
![](https://img-blog.csdnimg.cn/20200309121028266.png)
之后,点击左下角的Configure,在弹出的对话框中做如下选择:
![](https://img-blog.csdnimg.cn/20200309121028524.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后点击Finish,Cmake界面变成如下:
![](https://img-blog.csdnimg.cn/20200309123548849.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
此时,界面最下方的框框里不应有红色的报错信息。点击Generate按钮:
![](https://img-blog.csdnimg.cn/20200309121028638.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
注意最下方的框框里会显示出“Generating done”。
至此,Cmake创建工程环节已经完成,新生成的工程在cmake-bin文件夹内。
6、用VS2010打开工程并初步编译
打开VS2010,点击“文件→打开→项目/解决方案”,将cmake-bin文件夹内的工程打开:
![](https://img-blog.csdnimg.cn/20200309123633814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309123633777.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
将cloud_viewer_PointXYZ工程设为启动项目:
![](https://img-blog.csdnimg.cn/20200309123633773.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
按下F7编译工程,出现如下报错:
![](https://img-blog.csdnimg.cn/20200309123633330.png)
→这是因为我们C盘内没有相关的文件,所以需要下载安装相关的Qt文件。
7、QT安装
安装包:移动硬盘里有备份(20170528)。安装包如下图所示:
![](https://img-blog.csdnimg.cn/20200309123741967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309123741745.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
安装步骤:
双击安装包qt-win-opensource-4.8.0-vs2010,之后一路点击Next:
![](https://img-blog.csdnimg.cn/20200309123741535.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309123740958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309123741558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200309123741505.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
→安装路径选择默认。
→点击Install,安装完毕即可。
8、测试工程的再次编译和运行
在安装完QT之后,再次在VS2010中按下F7,编译工程,此次无error产生。
在VS界面下按下Ctrl+Alt+F5,得到如下图所示的运行结果。
![](https://img-blog.csdnimg.cn/20200309123741241.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
该结果说明没找到点云数据文件“my_point_cloud.pcd”。将该文件复制粘贴到test-project\camke-bin文件夹中,如下图所示:
![](https://img-blog.csdnimg.cn/20200309123741975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
(my_point_cloud.pcd文件已在移动硬盘中备份,位于移动硬盘的根目录下,如下图所示。20170528YC)
![](https://img-blog.csdnimg.cn/202003091237424.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
再次运行程序,运行结果如下:
![](https://img-blog.csdnimg.cn/2020030912374211.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
至此,完成了PCL的初步安装和调试。
9、附录:相关网址
①、Qt下载地址
http://blog.csdn.net/friendan/article/details/44873347
②、PCL特征点与配准(1)
http://www.cnblogs.com/li-yao7758258/p/6612856.html
③、PCL学习笔记(1):pcl1.6.0+vs2010环境配置以及第1个pcl程序
http://blog.csdn.net/chentravelling/article/details/43451589
④、PCL1.7.2 简单安装教程
http://www.zhangzscn.com/2015/10/31/x64vs2013pcl1-7-2-简单安装教程/
⑤、解决 vs2010问题:error MSB8008: 指定的平台工具集(v110)未安装或无效
http://blog.csdn.net/liuqiyao_01/article/details/38656873
⑥、问题:>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
http://www.cnblogs.com/newpanderking/articles/3372969.html
http://jingyan.baidu.com/article/fc07f9891c556412ffe519fa.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
B.不借助Cmake而在VS2010中调用PCL
本节中,记录了不使用Cmake而调用PCL的方法。和借助于Cmake生成一个工程相比,该方法更适合在已有工程上添加移植和PCL相关的代码。编译环境:visual studio2010、windows7操作系统。
参考了以下网址的内容:http://blog.csdn.net/bactone_li/article/details/26378325
本次总结是基于上述网址内容的细化和优化。因此也可以不看该参考网址。
1、在visual studio2010中新建工程
首先打开VS2010,新建一个VC++项目(win32控制台应用程序),工程名称:project_inliers。
文件→新建→项目,选择工程位置,“名称”处输入project_inliers:
![](https://img-blog.csdnimg.cn/20200309135831436.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
之后点击“确定”,在随后弹出来的对话框里直接点击“完成”:
![](https://img-blog.csdnimg.cn/20200309135831362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
2、添加代码
将新建的工程中的project_inliers.cpp的代码替换成下面的代码:
代码1:
#include "stdafx.h" //※(这一句很重要!)
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/project_inliers.h>
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected (new pcl::PointCloud<pcl::PointXYZ>);
// Fill in the cloud data
cloud->width = 5;
cloud->height = 1;
cloud->points.resize (cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size (); ++i)
{
cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
}
std::cerr << "Cloud before projection: " << std::endl;
for (size_t i = 0; i < cloud->points.size (); ++i)
std::cerr << " " << cloud->points[i].x << " "
<< cloud->points[i].y << " "
<< cloud->points[i].z << std::endl;
// Create a set of planar coefficients with X=Y=0,Z=1
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
coefficients->values.resize (4);
coefficients->values[0] = coefficients->values[1] = 0;
coefficients->values[2] = 1.0;
coefficients->values[3] = 0;
// Create the filtering object
pcl::ProjectInliers<pcl::PointXYZ> proj;
proj.setModelType (pcl::SACMODEL_PLANE);
proj.setInputCloud (cloud);
proj.setModelCoefficients (coefficients);
proj.filter (*cloud_projected);
std::cerr << "Cloud after projection: " << std::endl;
for (size_t i = 0; i < cloud_projected->points.size (); ++i)
std::cerr << " " << cloud_projected->points[i].x << " "
<< cloud_projected->points[i].y << " "
<< cloud_projected->points[i].z << std::endl;
return (0);
}
代码2:
#include "stdafx.h" //※(这一句很重要!)
#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
//可视化点云颜色特征。
boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{
/* 创建视窗对象,并给标题栏定义一个名称"3D Viewer",我们将它定义为boost::shared_ptr智能共享指针,
这样可以保证该指针在整个程序全局使用,而不引起内存错误,通常情况下,用户不需要这样做。*/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
//视窗的背景色可以设为用户喜欢的任意RGB颜色,本例中,我们将它设置为黑色。
viewer->setBackgroundColor (0, 0, 0);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
/*这是最重要的一行,我们将点云添加到视窗对象中,并定义一个唯一的字符串作为ID号,利用此字符串保证在其他成员方法中
也能标识引用该点云,多次调用addPointCloud(),可以实现多个点云的添加,每调用一次就创建一个新的ID号,
如果想更新一个已经显示的点云,用户必须先调用removePointCloud(),并提供需要更新的点云的ID号。*/
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
//改变现实点云的尺寸
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
//显示坐标系统的方向。
viewer->addCoordinateSystem (1.0);
//默认角度和方向。
viewer->initCameraParameters ();
return (viewer);
}
int // -----Main-----
main (int argc, char** argv)
{
// 自行创建一随机点云
pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
// std::cout << "Genarating example point clouds.\n\n";
// 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。
int r(255), g(15), b(15);
pcl::PointXYZ basic_point;
basic_point.x = 0; //
basic_point.y = 0; //
basic_point.z = 0; //
/*
for (float z(-1.0); z <= 1.0; z += 0.05)
{
//pcl::PointXYZ basic_point;
basic_point.x += 1; //
basic_point.y += 1; //
basic_point.z += 1; //
basic_cloud_ptr->points.push_back(basic_point);
pcl::PointXYZRGB point;
point.x = basic_point.x;
point.y = basic_point.y;
point.z = basic_point.z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back (point);
}
*/
for (float z(-1.0); z <= 1.0; z += 0.05)
{
for (float angle(0.0); angle <= 360.0; angle += 5.0)
{
pcl::PointXYZ basic_point;
basic_point.x = 0.5 * cosf (pcl::deg2rad(angle)); //
basic_point.y = sinf (pcl::deg2rad(angle)); //
basic_point.z = 1*z; //
basic_cloud_ptr->points.push_back(basic_point);
pcl::PointXYZRGB point;
point.x = basic_point.x;
point.y = basic_point.y;
point.z = basic_point.z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back (point);
}
/*
if (z < 0.0)
{
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
*/
}
basic_cloud_ptr->width = (int) basic_cloud_ptr->points.size ();
basic_cloud_ptr->height = 1;
point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
point_cloud_ptr->height = 1;
// 0.05为搜索半径获取点云法线
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
ne.setInputCloud (point_cloud_ptr);
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());
ne.setSearchMethod (tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch (0.05);
ne.compute (*cloud_normals1);
// 0.1为搜索半径获取点云法线
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch (0.1);
ne.compute (*cloud_normals2);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
viewer = rgbVis(point_cloud_ptr);
// 主循环
while (!viewer->wasStopped ())
{
viewer->spinOnce (100);
boost::this_thread::sleep (boost::posix_time::microseconds (100000));
}
}
上面2个测试代码中,代码1是用于控制台输出信息;代码2用于显示三维点云数据。可对上面2段代码分别进行测试。
代码添加注意事项:
经测试,在App.h,App.cpp,AppDlg.h,AppDlg.cpp这4个选项中,在App.h文件开头添加include比较合适,也即下面一段代码:
#include "stdafx.h" //※(这一句很重要!)
#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
3、配置目录
代码修改完之后,需要在工程属性中进行相关配置,在项目(p)-->project_inliers属性--->在新打开的属性窗口中进行多项配置:
①VC++目录--->包含目录--->添加:
C:\Program Files\PCL 1.6.0\include\pcl-1.6
C:\Program Files\PCL 1.6.0\3rdParty\Boost\include
C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include
C:\Program Files\PCL 1.6.0\3rdParty\FLANN\include
C:\Program Files\PCL 1.6.0\3rdParty\Qhull\include
C:\Program Files\PCL 1.6.0\3rdParty\VTK\include\vtk-5.8
C:\Program Files\OpenNI\Include
当然,为了表示的简单,我们也可以在打开VS2010建立工程项目之前先定义环境变量来简化此处的表达:
计算机-->属性-->高级系统设置-->环境变量-->系统变量-->新建,变量名PCL_ROOT,变量值:C:\Program Files\PCL 1.6.0。那么此时上面的包含路径表示可以改成: (注:上述划去的内容:具体路径因人而异,不能完全照搬!)
$(PCL_ROOT)\include\pcl-1.6
$(PCL_ROOT)\3rdParty\Boost\include
$(PCL_ROOT)\3rdParty\Eigen\include
$(PCL_ROOT)\3rdParty\FLANN\include
$(PCL_ROOT)\3rdParty\Qhull\include
$(PCL_ROOT)\3rdParty\VTK\include\vtk-5.8
C:\Program Files\OpenNI\Include
![](https://img-blog.csdnimg.cn/20200309142825328.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
②VC++目录--->库目录--->添加:
$(PCL_ROOT)\lib
$(PCL_ROOT)\3rdParty\Boost\lib
$(PCL_ROOT)\3rdParty\FLANN\lib
$(PCL_ROOT)\3rdParty\Qhull\lib
$(PCL_ROOT)\3rdParty\VTK\lib\vtk-5.8
C:\Program Files\OpenNI\Lib64
![](https://img-blog.csdnimg.cn/20200309142825297.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
③链接器-->输入-->附加依赖项,添加:
opengl32.lib
pcl_kdtree_debug.lib
pcl_io_debug.lib
pcl_search_debug.lib
pcl_segmentation_debug.lib
pcl_apps_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_visualization_debug.lib
pcl_common_debug.lib
flann_cpp_s-gd.lib
libboost_system-vc100-mt-gd-1_49.lib
libboost_filesystem-vc100-mt-gd-1_49.lib
libboost_thread-vc100-mt-gd-1_49.lib
libboost_date_time-vc100-mt-gd-1_49.lib
libboost_iostreams-vc100-mt-gd-1_49.lib
vtkalglib-gd.lib
vtkCharts-gd.lib
vtkCommon-gd.lib
vtkDICOMParser-gd.lib
vtkexoIIc-gd.lib
vtkexpat-gd.lib
vtkFiltering-gd.lib
vtkfreetype-gd.lib
vtkftgl-gd.lib
vtkGenericFiltering-gd.lib
vtkGeovis-gd.lib
vtkGraphics-gd.lib
vtkhdf5-gd.lib
vtkHybrid-gd.lib
vtkImaging-gd.lib
vtkInfovis-gd.lib
vtkIO-gd.lib
vtkjpeg-gd.lib
vtklibxml2-gd.lib
vtkmetaio-gd.lib
vtkNetCDF-gd.lib
vtkNetCDF_cxx-gd.lib
vtkpng-gd.lib
vtkproj4-gd.lib
vtkRendering-gd.lib
vtksqlite-gd.lib
vtksys-gd.lib
vtktiff-gd.lib
vtkverdict-gd.lib
vtkViews-gd.lib
vtkVolumeRendering-gd.lib
vtkWidgets-gd.lib
vtkzlib-gd.lib
4、运行结果
代码1:
![](https://img-blog.csdnimg.cn/20200309142825294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
代码2:
![](https://img-blog.csdnimg.cn/20200309142825296.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
至此,调试成功。
5、各种报错解决方案
报错1:error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记
解决方法:
方法1:
http://blog.csdn.net/rs_huangzs/article/details/50954828
![](https://img-blog.csdnimg.cn/20200309142825223.png)
![](https://img-blog.csdnimg.cn/20200309142825299.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
方法2:
http://blog.csdn.net/u012943043/article/details/71056476
![](https://img-blog.csdnimg.cn/20200309142825267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
20170725笔者:经实际测试,“或者在#include pcl头文件之前使用#undef max”(App.h文件中)可以有效解决程序中的报错:
![](https://img-blog.csdnimg.cn/20200309142825192.png)
报错2:32位PCL应在Debug 32模式下进行编译;64位PCL应在Debug x64模式下进行编译。否则会报错。
报错3:error C2661: “pcl::PointCloud<PointT>::operator new”: 没有重载函数接受 3 个参数
参考网址:
http://bbs.csdn.net/topics/390930955/
解决方法:
![](https://img-blog.csdnimg.cn/20200309142825291.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
在一个大神帖子里找到了答案。写在这给其他人参考:
MFC在最开头加了这样的预编译,导致PCL的new报错。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
解决方法:
把这三行注释
楼上说的对,
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
这三句话就在dialog的cpp里面,前面
报错4:“找不到标识符”
解决方法:
http://jingyan.baidu.com/article/95c9d20da32b5fec4e7561c3.html
![](https://img-blog.csdnimg.cn/20200309142825194.png)
报错5:“result”: 符号既不是类 模板 也不是函数 模板
解决方法:
http://blog.csdn.net/varding/article/details/8506149?utm_source=tuicool
socket的bind与function的bind冲突了...,只需要把调用socket的bind(xxxx)改成:::bind(xxxx)即可!!
![](https://img-blog.csdnimg.cn/20200309142825256.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
报错6:vs2010+pcl遇到的无法解析的外部命令
解决方法:
是因为在配置属性-》链接器 中的附加依赖项里面缺少了下面的.lib文件
参考网址:http://blog.csdn.net/lgdnr/article/details/47088769
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C.PCL学习网址链接
PCL学习资源(中文)网址:
http://www.pclcn.org/
![](https://img-blog.csdnimg.cn/2020030913511563.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
点云视窗类CloudViewer(1)
http://www.pclcn.org/study/shownews.php?lang=cn&id=149
![](https://img-blog.csdnimg.cn/20200309135142556.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
点云视窗类CloudViewer(2)
http://www.pclcn.org/study/shownews.php?lang=cn&id=151
![](https://img-blog.csdnimg.cn/20200309135219396.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
开源库PCL入门指南
http://www.zhangzscn.com/2015/11/16/开源库pcl入门指南/
![](https://img-blog.csdnimg.cn/20200309135239400.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
点云数据收集链接
http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=38
![](https://img-blog.csdnimg.cn/20200309135300482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
1.PCD格式数据集合
http://download.csdn.net/detail/xx__hu/8662161
![](https://img-blog.csdnimg.cn/20200309135328888.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
2.PCD格式数据集合
http://download.csdn.net/detail/xx__hu/8662169
![](https://img-blog.csdnimg.cn/20200309135344814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)
PCL学习笔记(4):创建点云文件、加载点云文件
http://blog.csdn.net/chentravelling/article/details/43740459
![](https://img-blog.csdnimg.cn/20200309135407373.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaGFpbHVvYTY=,size_16,color_FFFFFF,t_70)