1)准备工作
完成PCL的环境设置后,下载LAStool:http://lastools.github.io/download/LAStools.zip
并解压到指定的文件夹,这里我为了配置环境方便,就放在了PCL文件夹下:
打开Visual Studio2019,打开已有的项目或解决方案,选择lastools.dsw打开,项目会自动迁移,有一些项目因为LASlib是在vc++ 6.0上编译的没法打开,选择确定就可以了。
对于加载失败的文件,选择卸载即可:
2)修改代码
打开LASlib模块的头文件mydefs.hpp,定位到69行,只保留 #if defined(_MSC_VER),删除或注释该行其它代码。
3)配置环境
由于之前配置的PCL是在64位环境下,所以这里也需要将lastool配置为64位。右击lastool项目,打开属性页 -- 配置属性 -- 配置管理器 -- 选择X64平台:
右击打开LASlib的属性页,选择配置属性 -- 常规,更改以下内容:
(1)输出目录改为:$(SolutionDir)$(ProjectName)\$(Configuration)\
(2)配置类型改为:静态库
(3)Windows SDK版本改为:最新安装的版本即可
(4)打开C/C++,选择代码生成 -- 运行库,更改为多线程DLL(/MD):
(5) 打开C/C++,选择常规 -- 附加包含目录,删去:…\laszip\stl
注意:这里的配置是在活动Debug下配置的,如果要配置Release,还需要重新配置一次。
4)生成lib文件
在Debug和Release版本下,选择LASlib,先进行代码清理,然后再生成,在对应的LASlib下,可以找到生成的lib文件:
带D的是Debug版的,不带D的是Release版的。
5)配置PCL环境
(1)打开之前配置的PCLEnvironmentSet,右击项目,打开属性,选择VC++目录 -- 包含目录,添加以下目录:
D:\PCL 1.12.0\LAStools\LASlib\inc
D:\PCL 1.12.0\LAStools\LASzip\src
(2)选择VC++目录 -- 库目录,添加库目录:
D:\PCL 1.12.0\LAStools\LASlib\lib
(3)打开链接器,选择输入 -- 附加依赖项,添加:LASlibD.lib或者LASlib.lib,这根据你配置的编译器是Debug还是Release。
6)测试代码
int main()
{
//打开las文件
LASreadOpener lasrReadOpener;
lasrReadOpener.set_file_name("E:\\PCL\\example\\source\\ground.las");
LASreader* lasReader = lasrReadOpener.open(false);
size_t count = lasReader->header.number_of_point_records;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
cloud->width = count;
cloud->height = 1;
cloud->resize(count);
cloud->is_dense = false;
double xOffset = lasReader->header.x_offset;// 偏移值
double yOffset = lasReader->header.y_offset;
double zOffset = lasReader->header.z_offset;
size_t j = 0;
while (lasReader->read_point() && j < count)
{
cloud->points[j].x = lasReader->point.get_x() - xOffset;
cloud->points[j].y = lasReader->point.get_y() - yOffset;
cloud->points[j].z = lasReader->point.get_z() - zOffset;
cloud->points[j].r = lasReader->point.get_R();
cloud->points[j].g = lasReader->point.get_G();
cloud->points[j].b = lasReader->point.get_B();
++j;
}
pcl::io::savePCDFileASCII("XX.pcd", *cloud);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);// 显示RGB
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); // 设置点云大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
显示效果如下:
虽然看上去黑黢黢的,但其实是有点的: