【PCL1.11.0+win10+vs2019】环境配置/ 点云格式转换及可视化

news2024/11/24 20:44:30

文章目录

  • 一、安装
    • 1.1 下载PCL
    • 1.2 安装PCL
    • 1.3 安装OSGeo4W
  • 二、配置
    • 2.1 配置环境变量
    • 2.2 配置VS2019
  • 三、点云格式转换以及可视化
  • 参考

一、安装

1.1 下载PCL

首先我们需要下载pcl1.11.0 ,这个版本与vs2019对应。
有两种下载方法:百度网盘、官网下载。二选一即可~


下载方法1:百度网盘
链接:https://pan.baidu.com/s/1tQEzhvY4HYw1OJw6W-0fOQ
提取码:qi8w
在这里插入图片描述


下载方法2:官网下载

  • 官网链接: https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.11.0
  • 下载两个文件:
    PCL-1.11.0-AllInOne-msvc2019-win64.exe
    pcl-1.11.0-pdb-msvc2019-win64.zip
    在这里插入图片描述

1.2 安装PCL

  • 双击“PCL-1.9.0-AllInOne-msvc2017-win64.exe”进行安装
    在这里插入图片描述
    在这里插入图片描述
    选择“Add PCL to the system PATH for all users”,自动把路径添加到系统环境变量中。
    在这里插入图片描述
    在这里插入图片描述
    默认是C:\Program Files\PCL 1.11.0 ,也可以改到其他的路径,但是需要记住安装的根路径,方便后续对环境进行配置。
    在这里插入图片描述

如果安装的过程中提示 path too long installer unable to modify path, 不要慌,说明只是环境变量没有自动配置好,接下来我们手动配置即可。


  • 解压“pcl-1.11.0-pdb-msvc2019-win64.zip”,将解压得到的文件夹中的内容添加“C:\Program Files\\PCL 1.11.0\bin”中。
    在这里插入图片描述
    在这里插入图片描述

  • 检测路径C:\Program Files\PCL 1.11.0\3rdParty\OpenNI2下是否安装了OpenNI2:
    如果文件夹中只有下图红框标注的.msi文件,则说明未安装OpenNI2,则需要点击该.msi文件进行手动安装。
    否则跳过这一步就可以啦。
    在这里插入图片描述
    点击该.msi文件进行手动安装,注意安装的路径选择C:\Program Files\PCL 1.11.0\3rdParty\OpenNI2
    在这里插入图片描述

1.3 安装OSGeo4W

  • OSGeo4W下载地址
    在这里插入图片描述
  • 安装OSGeo4W
    在这里插入图片描述
    在这里插入图片描述
    选择默认的安装路径(也可以自定义路径,但需要记住安装的根路径,方便后续添加环境变量)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    选择https://ftp.osuosl.org
    在这里插入图片描述
    搜索框输入pdal,点击skip,选中图中版本。
    在这里插入图片描述
    开始安装各种依赖
    在这里插入图片描述
    安装完成后,如下图
    在这里插入图片描述

二、配置

2.1 配置环境变量

  • 搜索 查看高级系统设置
    在这里插入图片描述
  • 点击环境变量
    在这里插入图片描述
  • 查看系统变量,已经有自动设置好的PCL_ROOT
    在这里插入图片描述
  • 双击Path 新建如下环境变量
%PCL_ROOT%\bin
%PCL_ROOT%\3rdParty\FLANN\bin
%PCL_ROOT%\3rdParty\VTK\bin
%PCL_ROOT%\3rdParty\Qhull\bin
%PCL_ROOT%\3rdParty\OpenNI2\Tools
%PCL_ROOT%\3rdParty\OpenNI2\Redist
C:\OSGeo4W\bin

在这里插入图片描述

  • 点击确定,重启电脑后生效

2.2 配置VS2019

  • 打开VS2019,创建一个名为testPCL的空项目
    在这里插入图片描述
  • 编译环境改为X64,Release版本。
    在这里插入图片描述
  • 视图-其他窗口-属性管理器
    在这里插入图片描述
  • Release|x64 - 添加新项目属性表
    在这里插入图片描述
  • 给属性表命名
    在这里插入图片描述
  • 双击新建的属性表
    在这里插入图片描述

VC++ 目录

  • VC++ 目录 - 包含目录/库目录 - 下三角 -<编辑..>
    在这里插入图片描述

包含目录中添加以下7个目录:(注意版本和路径以及名称,建议点击右上角黄色的图标手动添加)
在这里插入图片描述

C:\Program Files\PCL 1.11.0\3rdParty\VTK\include\vtk-8.2
C:\Program Files\PCL 1.11.0\3rdParty\OpenNI2\Include
C:\Program Files\PCL 1.11.0\3rdParty\Qhull\include
C:\Program Files\PCL 1.11.0\3rdParty\FLANN\include
C:\Program Files\PCL 1.11.0\3rdParty\Eigen\eigen3
C:\Program Files\PCL 1.11.0\3rdParty\Boost\include\boost-1_73
C:\Program Files\PCL 1.11.0\include\pcl-1.11

库目录 中添加以下7个目录:
在这里插入图片描述

C:\Program Files\PCL 1.11.0\3rdParty\OpenNI2\Lib
C:\OSGeo4W\lib
C:\Program Files\PCL 1.11.0\3rdParty\VTK\lib
C:\Program Files\PCL 1.11.0\3rdParty\Qhull\lib
C:\Program Files\PCL 1.11.0\3rdParty\FLANN\lib
C:\Program Files\PCL 1.11.0\3rdParty\Boost\lib
C:\Program Files\PCL 1.11.0\lib

C/C++—>预处理器—>预处理器定义

  • 点击预处理定义
    在这里插入图片描述
  • 添加如下内容
    在这里插入图片描述
BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE

C/C++ ->所有选项->SDL检查

  • 属性页中将SDL检查设为
    在这里插入图片描述
  • 项目也中将SDL检查设为
    在这里插入图片描述
    在这里插入图片描述

链接器—>输入—>附加的依赖项

  • PCL 1.11.0\3rdParty\VTK\libPCL 1.11.0\lib以及C:\OSGeo4W\lib这三个文件夹下的lib文件的release版本添加到附加依赖项中
    在这里插入图片描述
    在这里插入图片描述
pcl_common.lib
pcl_features.lib
pcl_filters.lib
pcl_io.lib
pcl_io_ply.lib
pcl_kdtree.lib
pcl_keypoints.lib
pcl_ml.lib
pcl_octree.lib
pcl_outofcore.lib
pcl_people.lib
pcl_recognition.lib
pcl_registration.lib
pcl_sample_consensus.lib
pcl_search.lib
pcl_segmentation.lib
pcl_stereo.lib
pcl_surface.lib
pcl_tracking.lib
pcl_visualization.lib
vtkChartsCore-8.2.lib
vtkCommonColor-8.2.lib
vtkCommonComputationalGeometry-8.2.lib
vtkCommonCore-8.2.lib
vtkCommonDataModel-8.2.lib
vtkCommonExecutionModel-8.2.lib
vtkCommonMath-8.2.lib
vtkCommonMisc-8.2.lib
vtkCommonSystem-8.2.lib
vtkCommonTransforms-8.2.lib
vtkDICOMParser-8.2.lib
vtkDomainsChemistry-8.2.lib
vtkDomainsChemistryOpenGL2-8.2.lib
vtkdoubleconversion-8.2.lib
vtkexodusII-8.2.lib
vtkexpat-8.2.lib
vtkFiltersAMR-8.2.lib
vtkFiltersCore-8.2.lib
vtkFiltersExtraction-8.2.lib
vtkFiltersFlowPaths-8.2.lib
vtkFiltersGeneral-8.2.lib
vtkFiltersGeneric-8.2.lib
vtkFiltersGeometry-8.2.lib
vtkFiltersHybrid-8.2.lib
vtkFiltersHyperTree-8.2.lib
vtkFiltersImaging-8.2.lib
vtkFiltersModeling-8.2.lib
vtkFiltersParallel-8.2.lib
vtkFiltersParallelImaging-8.2.lib
vtkFiltersPoints-8.2.lib
vtkFiltersProgrammable-8.2.lib
vtkFiltersSelection-8.2.lib
vtkFiltersSMP-8.2.lib
vtkFiltersSources-8.2.lib
vtkFiltersStatistics-8.2.lib
vtkFiltersTexture-8.2.lib
vtkFiltersTopology-8.2.lib
vtkFiltersVerdict-8.2.lib
vtkfreetype-8.2.lib
vtkGeovisCore-8.2.lib
vtkgl2ps-8.2.lib
vtkglew-8.2.lib
vtkGUISupportMFC-8.2.lib
vtkhdf5-8.2.lib
vtkhdf5_hl-8.2.lib
vtkImagingColor-8.2.lib
vtkImagingCore-8.2.lib
vtkImagingFourier-8.2.lib
vtkImagingGeneral-8.2.lib
vtkImagingHybrid-8.2.lib
vtkImagingMath-8.2.lib
vtkImagingMorphological-8.2.lib
vtkImagingSources-8.2.lib
vtkImagingStatistics-8.2.lib
vtkImagingStencil-8.2.lib
vtkInfovisCore-8.2.lib
vtkInfovisLayout-8.2.lib
vtkInteractionImage-8.2.lib
vtkInteractionStyle-8.2.lib
vtkInteractionWidgets-8.2.lib
vtkIOAMR-8.2.lib
vtkIOAsynchronous-8.2.lib
vtkIOCityGML-8.2.lib
vtkIOCore-8.2.lib
vtkIOEnSight-8.2.lib
vtkIOExodus-8.2.lib
vtkIOExport-8.2.lib
vtkIOExportOpenGL2-8.2.lib
vtkIOExportPDF-8.2.lib
vtkIOGeometry-8.2.lib
vtkIOImage-8.2.lib
vtkIOImport-8.2.lib
vtkIOInfovis-8.2.lib
vtkIOLegacy-8.2.lib
vtkIOLSDyna-8.2.lib
vtkIOMINC-8.2.lib
vtkIOMovie-8.2.lib
vtkIONetCDF-8.2.lib
vtkIOParallel-8.2.lib
vtkIOParallelXML-8.2.lib
vtkIOPLY-8.2.lib
vtkIOSegY-8.2.lib
vtkIOSQL-8.2.lib
vtkIOTecplotTable-8.2.lib
vtkIOVeraOut-8.2.lib
vtkIOVideo-8.2.lib
vtkIOXML-8.2.lib
vtkIOXMLParser-8.2.lib
vtkjpeg-8.2.lib
vtkjsoncpp-8.2.lib
vtklibharu-8.2.lib
vtklibxml2-8.2.lib
vtklz4-8.2.lib
vtklzma-8.2.lib
vtkmetaio-8.2.lib
vtkNetCDF-8.2.lib
vtkogg-8.2.lib
vtkParallelCore-8.2.lib
vtkpng-8.2.lib
vtkproj-8.2.lib
vtkpugixml-8.2.lib
vtkRenderingAnnotation-8.2.lib
vtkRenderingContext2D-8.2.lib
vtkRenderingContextOpenGL2-8.2.lib
vtkRenderingCore-8.2.lib
vtkRenderingExternal-8.2.lib
vtkRenderingFreeType-8.2.lib
vtkRenderingGL2PSOpenGL2-8.2.lib
vtkRenderingImage-8.2.lib
vtkRenderingLabel-8.2.lib
vtkRenderingLOD-8.2.lib
vtkRenderingOpenGL2-8.2.lib
vtkRenderingVolume-8.2.lib
vtkRenderingVolumeOpenGL2-8.2.lib
vtksqlite-8.2.lib
vtksys-8.2.lib
vtktheora-8.2.lib
vtktiff-8.2.lib
vtkverdict-8.2.lib
vtkViewsContext2D-8.2.lib
vtkViewsCore-8.2.lib
vtkViewsInfovis-8.2.lib
vtkzlib-8.2.lib
pdalcpp.lib
pdal_util.lib
libpdal_plugin_writer_pgpointcloud.lib
libpdal_plugin_reader_pgpointcloud.lib
libpdal_plugin_kernel_fauxplugin.lib
liblas_c.lib
liblas.lib
laszip3.lib

三、点云格式转换以及可视化

PCL 各种三维格式转PCD文件(ply、stl、xyz、obj、asc、txt、las、laz、bin

//#pragma execution_character_set("utf-8")//解决中文
#include <Winsock2.h>
#include <windows.h>
//pcd
#include <pcl/io/pcd_io.h>
//ply
#include <pcl/io/ply_io.h>
//stl
#include <pcl/io/vtk_lib_io.h>
//mesh
#include <vtkTriangleFilter.h>
#include <pcl/common/common.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pdal/PointTable.hpp>
#include <pdal/Options.hpp>
#include <pdal/io/LasHeader.hpp>
#include <pdal/io/LasReader.hpp>
#include <string>


using namespace std;
typedef pcl::PointXYZ PointT;
typedef pcl::PointXYZI PointTI;

void ply2pcd(std::string filename, pcl::PointCloud<PointT>::Ptr& cloud)
{
    pcl::PLYReader reader;
    reader.read<PointT>(filename, *cloud);

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}

void stl2pcd(std::string filename, pcl::PointCloud<PointT>::Ptr& cloud)
{
    //读取STL格式模型
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(filename.c_str());
    reader->Update();
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    polydata = reader->GetOutput();
    polydata->GetNumberOfPoints();

    //从poly转pcd
    pcl::io::vtkPolyDataToPointCloud(polydata, *cloud);

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}

void obj2pcd(std::string filename, pcl::PointCloud<PointT>::Ptr& cloud)
{
    //读取STL格式模型
    vtkSmartPointer<vtkPolyData> polydata;
    vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();
    reader->SetFileName(filename.c_str());
    reader->Update();
    polydata = reader->GetOutput();
    pcl::io::vtkPolyDataToPointCloud(polydata, *cloud);

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}


struct tagPOINT_3D
{
    float x;
    float y;
    float z;
    float I;
};
void txt2pcd(std::string filename, pcl::PointCloud<PointT>::Ptr& cloud)
{
    int number_Txt;
    string line;
    tagPOINT_3D TxtPoint;
    vector<tagPOINT_3D> m_vTxtPoints;
    //输入txt文件
    ifstream input(filename);

    //读取文件中的有效值
    while (getline(input, line)) {
        tagPOINT_3D TxtPoint;
        replace(line.begin(), line.end(), ',', ' ');//将逗号替换为空格

        istringstream record(line);
        record >> TxtPoint.x;
        record >> TxtPoint.y;
        record >> TxtPoint.z;
        //record >> TxtPoint.I;
        //先将数据写入m_vTxtPoints
        m_vTxtPoints.push_back(TxtPoint);
    }
    number_Txt = m_vTxtPoints.size();
    // 设置pcd文件属性
    cloud->width = number_Txt;
    cloud->height = 1;
    cloud->is_dense = false;
    cloud->points.resize(cloud->width * cloud->height);
    //将m_vTxtPoints数据写入pcd文件
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud->points[i].x = m_vTxtPoints[i].x;
        cloud->points[i].y = m_vTxtPoints[i].y;
        cloud->points[i].z = m_vTxtPoints[i].z;
        //cloud->points[i].intensity = m_vTxtPoints[i].I;
    }

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}


//导入文件
bool
loadCloud(const std::string& filename, pcl::PointCloud<PointT>& cloud)
{
    std::ifstream fs;
    fs.open(filename.c_str(), std::ios::binary);
    if (!fs.is_open() || fs.fail())
    {
        PCL_ERROR("Could not open file '%s'! Error : %s\n", filename.c_str(), strerror(errno));
        fs.close();
        return (false);
    }

    std::string line;
    std::vector<std::string> st;

    while (!fs.eof())
    {
        std::getline(fs, line);
        //忽略空行
        if (line.empty())
            continue;

        // 标记线
        boost::trim(line);
        boost::split(st, line, boost::is_any_of("\t\r "), boost::token_compress_on);

        if (st.size() != 3)
            continue;
        //将数据写入pcd文件
        cloud.push_back(PointT(float(atof(st[0].c_str())), float(atof(st[1].c_str())), float(atof(st[2].c_str()))));
    }
    fs.close();
    //设置pcd文件属性
    cloud.width = cloud.size(); cloud.height = 1; cloud.is_dense = true;
    return (true);
}
void xyz2pcd(std::string filename, pcl::PointCloud<PointT>::Ptr& cloud)
{
    //读取xyz格式模型
    if (!loadCloud(filename, *cloud))
        cout << filename << "读取失败" << endl;

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}


void bin2pcd(std::string filename, pcl::PointCloud<PointTI>::Ptr& cloud)
{
    // load point cloud
    fstream input(filename.c_str(), ios::in | ios::binary);
    if (!input.good()) {
        cerr << "Could not read file: " << filename << endl;
        exit(EXIT_FAILURE);
    }
    input.seekg(0, ios::beg);

    //pcl::PointCloud<PointTI>::Ptr points(new pcl::PointCloud<PointXYZI>);

    int i;
    for (i = 0; input.good() && !input.eof(); i++) {
        pcl::PointXYZI point;
        input.read((char*)&point.x, 3 * sizeof(float));
        input.read((char*)&point.intensity, sizeof(float));
        cloud->push_back(point);
    }
    input.close();

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }
}


void las2pcd(const std::string filename, pcl::PointCloud<PointTI>::Ptr& cloud) {

    //中文可能会有乱码
    cout << "读取" << filename << "..." << endl;
    pdal::Option las_opt("filename", filename);
    pdal::Options las_opts;
    las_opts.add(las_opt);
    pdal::PointTable table;

    pdal::LasReader las_reader;
    las_reader.setOptions(las_opts);
    las_reader.prepare(table);
    pdal::PointViewSet point_view_set = las_reader.execute(table);
    pdal::PointViewPtr point_view = *point_view_set.begin();
    pdal::Dimension::IdList dims = point_view->dims();
    pdal::LasHeader las_header = las_reader.header();

    //头文件信息
    unsigned int PointCount = las_header.pointCount();
    double scale_x = las_header.scaleX();
    double scale_y = las_header.scaleY();
    double scale_z = las_header.scaleZ();

    double offset_x = las_header.offsetX();
    double offset_y = las_header.offsetY();
    double offset_z = las_header.offsetZ();

    //读点
    unsigned int n_features = las_header.pointCount();
    int count = 0;

    for (pdal::PointId id = 0; id < point_view->size(); ++id)
    {
        double x = point_view->getFieldAs<double>(pdal::Dimension::Id::X, id);
        double y = point_view->getFieldAs<double>(pdal::Dimension::Id::Y, id);
        double z = point_view->getFieldAs<double>(pdal::Dimension::Id::Z, id);
        double intensity = point_view->getFieldAs<double>(pdal::Dimension::Id::Intensity, id);

        PointTI point(x, y, z, intensity);
        cloud->push_back(point);
    }

    //用对应的文件名保存pcd文件
    std::string pp = boost::filesystem::path(filename).filename().string();
    string name = pp.substr(0, pp.rfind("."));
    std::string pcdfilename = name.append(".pcd");
    cout << pcdfilename << endl;
    pcl::io::savePCDFileASCII(pcdfilename, *cloud);
    //依据需要选择保存的格式
    //pcl::io::savePCDFileBinary(pcdfilename, *cloud);     
    if (!cloud->empty())
    {
        cout << filename << "转换完成" << endl;
    }

}

int
main(int argc, char* argv[]) {
    pcl::PointCloud<pcl::PointXYZI>::Ptr lascloud(new pcl::PointCloud<pcl::PointXYZI>);
    pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    string file0 = "E:\\VS2019Projects\\PCL\\2pcd\\Data1\\bunny.ply";
    //ply2pcd(file0, cloud);
    string file1 = "E:\\VS2019Projects\\PCL\\2pcd\\Data1\\AfricanAnimals.stl";
    //stl2pcd(file1, cloud);
    string file2 = "E:\\dataset\\PCL\\kitti_000008_points.obj";
    obj2pcd(file2, cloud);
    string file3 = "E:\\VS2019Projects\\PCL\\2pcd\\Data1\\dragon.txt";
    //txt2pcd(file3, cloud);
    string file4 = "E:\\VS2019Projects\\PCL\\2pcd\\Data1\\目标1.asc";
    //txt2pcd(file4, cloud);
    string file5 = "E:\\VS2019Projects\\PCL\\2pcd\\Data1\\crystal_4000.xyz";
    //xyz2pcd(file5, cloud);
    string file6 = "E:\\VS2019Projects\\PCL\\2pcd\\data\\000000.bin";
    // bin2pcd(file6, lascloud);

    //las2pcd(file, lascloud, true);
    //--------------------------------------可视化--------------------------
    pcl::visualization::PCLVisualizer viewer;
    viewer.addPointCloud<PointT>(cloud, "cloud");
    viewer.addCoordinateSystem();
    while (!viewer.wasStopped())
    {
        viewer.spinOnce(100);
    }
    //清空内存
    cloud->points.clear();
}

objpcd文件为例
在这里插入图片描述
运行效果如下:
在这里插入图片描述

参考

win10+vs2019+pcl1.11.0安装教程_a_zhua66的博客-CSDN博客_vs pcl1.11

配置PCL过程中提示 path too long installer unable to modify path解决_Quelquefois的博客-CSDN博客_pcl path too long

https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.11.0

PCL 各种三维格式转PCD文件(ply、stl、xyz、obj、asc、txt、las、laz、bin)_stay hungry foolish的博客-CSDN博客_pcd格式转换

最具体和最简单的PDAL库配置及在VS2019上测试_stay hungry foolish的博客-CSDN博客_osgeo4w安装liblas

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker原理及服务编排

一、什么是docker Docker 是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache 2.0协议&#xff0c;项目代码在GitHub上进行维护。 Docker 项…

【毕业设计_课程设计】基于Spark网易云音乐数据分析

文章目录0 项目说明1 系统模块2 分析内容3 界面展示4 项目工程0 项目说明 基于Spark网易云音乐数据分析 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;源码开放 1 系统模块 包含爬虫,Scala代码,Spark,Hadoop,ElasticSearch,logstash,Flume…

基于ChatGPT实现微信智能机器人

ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回应&am…

汇编语言笔记——接口技术与编程

文章目录传送门储存系统与技术材料高速储存器缓冲储存器&#xff08;Cache&#xff09;材料&#xff0c;局部性&#xff0c;访问方式Cache全相联映射Cache交换与一致性单核CPU一致性处理多核CPU的MESI协议主储存器&#xff08;内存&#xff09;主要技术指标容量带宽内存模组与内…

【JavaWeb】Servlet

Servlet简介 Servlet是sun公司开发动态web的一门技术Sun在这些API中提供一个接口叫做&#xff1a;Servlet&#xff0c;如果想开发一个Servlet程序&#xff0c;需要编写一个类&#xff0c;实现Servlet接口把开发好的Java类部署到web服务器中 把实现了Servlet接口的Java程序叫做…

【Anime.js】——Anime.js源码核心理解

一、Anime.js整体结构 Anime.js的强大之处在于代码量非常少&#xff0c;但功能却非常强大。让我们一起来探索Anime.js源码的核心吧~ Anime.js之所以能如此强大主要是因为它的代码结构设计的非常巧妙合理&#xff0c;所以我们想要掌握Anime.js的核心&#xff0c;首先我们要了解…

Linux内核基础篇——动态输出调试

文章目录配置内核编译选项debugfs文件系统挂载动态输出使用实际案例动态输出&#xff08;dynamic print&#xff09;是内核子系统开发者最喜欢的输出技术之一。 上篇说到printk调试&#xff0c;但printk是全局的&#xff0c;只能设置输出等级。而动态输出可以动态选择打开某个…

Tensorflow Serving部署推荐模型

Tensorflow Serving部署推荐模型 1、找到当前模型中定义的variables&#xff0c;并在此定义一个saver用于保存模型参数 def saveVariables(self):variables_dict {}variables_dict[self.user_embedding.op.name] self.user_embeddingvariables_dict[self.item_embedding.op…

【LeetCode】1971. 寻找图中是否存在路径

题目描述 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连…

犀牛插件开发-基础核心-技术概览-总体架构-教程

文章目录1.概述2.基础核心2.1.C Rhino 核心2.2.openNURBS2.3.C SDK3.C Stack3.1.C Plugins3.2.RhinoScript4.NET Stack4.1.C API4.2.NET Framework4.3.RhinoCommon4.4.Eto4.5.net插件4.6.Grasshopper组件4.7.Python脚本5.相关主题1.概述 《Rhinoceros》由许多层组成——用多种…

细说OA系统的繁荣发展

改革开放以来&#xff0c;科技发展突飞猛进&#xff0c;我们生活的方方面面都受到了巨大影响。随着信息化时代的到来&#xff0c;企业的办公方式也发生了巨大的改变&#xff0c;OA系统随之走进了大众的视野。细数这四十几年&#xff0c;OA办公系统已经由一个异想天开的想法变成…

centos7.8离线安装pg和postgis

安装包下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MxJc-5Ws6OPTRAoC-2srJw 提取码&#xff1a;is2q 1.centos7.8 离线安装pg操作步骤 这里基于centos7.8空白系统操作实践写的文档&#xff0c;系统一致的情况下可以照搬教程操作安装&#xff0c;镜像为…

1.0、Hibernate-快速入门初体验

1.0、Hibernate-快速入门初体验 Hibernate 和 mybatis 一样是 ORM (Object Relation Mapping) 对象关系映射框架&#xff0c;将面向对象映射成面向关系。 如何使用呢&#xff1f; 1、导入依赖&#xff1b; 2、创建 Hibernate 配置文件&#xff1b; 3、创建实体类&#xff1b; 4…

Allegro172版本多人协同在线设计操作指导

Allegro172版本多人协同在线设计操作指导 Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下 首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本 第一个用户打开PCB,选择Symphony Team design 选择 Start Symphony …

2022年度总结

自我介绍 大家好&#xff0c;我又回来了&#xff01;我在一年之前在 CSDN 写了第一篇文章&#xff0c;到现在也有一年时间了。这次回来呢&#xff0c;也是因为 CSDN 官方发的消息&#xff0c;让写一篇年度总结的文章。在离开的这几个月里&#xff0c;主要是因为工作繁忙&#…

ASO优化:总结APP被下架的5点原因

随着苹果的App Store的监管力度的不断加强&#xff0c;每个APP都会有被下架的风险&#xff0c;而对于开发者来说&#xff0c;APP被下架是一件很严重的事情&#xff0c;不仅会造成用户的流失&#xff0c;还会降低用户对APP 的信任。所以&#xff0c;我们要了解APP被下架的原因&a…

【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)

需要源码和依赖请点赞关注收藏后评论区留言私信~~~ 一、Dataframe操作 步骤如下 1&#xff09;利用IntelliJ IDEA新建一个maven工程&#xff0c;界面如下 2&#xff09;修改pom.XML添加相关依赖包 3&#xff09;在工程名处点右键&#xff0c;选择Open Module Settings 4&a…

整数的大小端序

在存储整数时&#xff0c;一般按字节为逻辑单位进行存储&#xff0c;有“小端序”和“大端序”之分。小端序&#xff08;little-endian&#xff09; 是指将表示整数的低位字节存储在内存地址的低位&#xff0c;高位字节存储在内存地址的高位。如果将整数 1982062410 存储至内存…

【CANN训练营第三季】2022年度第三季新手班之昇腾AI入门课

本次参加CANN训练营&#xff0c;本来我报名的是进阶班课程&#xff0c;再看一遍新手班&#xff0c;学习一下目前CANN的最新进展也是不错的&#xff0c;巩固一下。 视频课程大家可以从这里看到 &#xff08;1&#xff09;【CANN训练营第三季】- 昇腾AI入门课&#xff08;上&am…

使用Keepalived工具实现集群节点的高可用

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;蟹黄瓜子文章来源&#xff1a;社区投稿 1.前言 在集群当中离不开的一个词就是是高可用&#xff0c;用本文来…