由于前面使用pdal库直接使用终端命令
sudo apt install pdal
pcl_pcd2ply input.pcd temp.ply
padal translate temp.ply output.las
运行pcl_pcd2ply显示无法转换命令,假设已经安装ros下面有自带pcl库。
选择一键安装pcl
sudo apt-get install libpcl-dev
ubuntu对应版本如下
命令找不到提示如下:
继续安装pcl-tools
sudo apt install pcl-tools
成功转换
尽管liblas作者提示已经不在维护,取而代之是pdal。但是考虑到c++代码转换效率快,仍使用liblas进行转换。
安装boost 1.71.0
https://www.boost.org/users/history/
解压文件包
tar -zxvf filename.tar.gz
进入boost文件:
cd ../boost_1_71_0
然后输入:
./bootstrap.sh
./b2
./b2 headers
测试是否安装成功:(新建test.cpp 使用im进行编辑cpp文件 按i是编辑 esc是退出编辑 :wq 保存退出)
touch test.cpp
vim test.cpp
在test.cpp输入下面代码:
#include<iostream>
#include<boost/bind.hpp>
using namespace std;
using namespace boost;
int fun(int x,int y){return x+y;}
int main(){
int m=1;int n=2;
cout<<boost::bind(fun,_1,_2)(m,n)<<endl;
return 0;
}
编译test.cpp
g++ test.cpp -o test
运行test.cpp
./test
输出结果为3,安装成功。
安装liblas1.8.1
https://liblas.org/download.html
解压文件
tar -jxvf libLAS-1.8.1.tar.bz2
cd ../libLAS-1.8.1.tar.bz2
mkdir build
cd build
cmake ..
make
sudo make install
编译百分百通过,使用终端查看las信息
c++转换代码(pcd转las)
#include <liblas/liblas.hpp>
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
void writeLasFromPointCloud3(const char* strInputPointCloudName, const char* strOutLasName)
{
std::ofstream ofs(strOutLasName, std::ios::out | std::ios::binary);
if (!ofs.is_open())
{
std::cout << "Error: unable to open file las....." << std::endl;
return;
}
liblas::Header header;
header.SetVersionMajor(1);
header.SetVersionMinor(2);
header.SetDataFormatId(liblas::PointFormatName::ePointFormat3); // This format supports color
header.SetScale(0.001, 0.001, 0.001);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile(strInputPointCloudName, *cloud);
std::cout << "Total points: " << cloud->points.size() << std::endl;
liblas::Writer writer(ofs, header);
liblas::Point point(&header);
for (size_t i = 0; i < cloud->points.size(); i++)
{
double x = cloud->points[i].x;
double y = cloud->points[i].y;
double z = cloud->points[i].z;
point.SetCoordinates(x, y, z);
writer.WritePoint(point);
}
// Update header with correct point count after writing all points
header.SetPointRecordsCount(cloud->points.size());
writer.SetHeader(header);
}
int main()
{
char strInputPointCloudName[] = "bunny.pcd";
char strOutLasName[] = "bunny.las";
writeLasFromPointCloud3(strInputPointCloudName, strOutLasName);
return 0;
}
CmakeList.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(pcd2las)
find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
include_directories(/usr/local/include)
link_directories(${PCL_LIBRARY_DIRS})
link_directories(/usr/local/lib)
add_definitions(${PCL_DEFINITIONS})
add_executable(pcd2las test.cpp)
target_link_libraries(pcd2las ${PCL_LIBRARIES})
# target_link_libraries (pcd2las liblas.so )
target_link_libraries(pcd2las liblas.so.2.4.0)
# target_link_libraries (pcd2las liblas_c.so )
# target_link_libraries (pcd2las liblas_c.so.2.4.0 )
# target_link_libraries (pcd2las liblas_c.so.3 )
上面的liblas路径直接写了固定路径,可根据自身环境修改,或者使用宏
转换成功:
文章参考:
https://blog.csdn.net/weixin_43779943/article/details/102639516?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-1-102639516-blog-118978436.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-1-102639516-blog-118978436.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=1https://blog.csdn.net/weixin_43779943/article/details/102639516?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~Ctr-1-102639516-blog-118978436.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~Ctr-1-102639516-blog-118978436.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=1https://www.cnblogs.com/lovebay/p/9298288.htmlhttps://www.cnblogs.com/lovebay/p/9298288.html