PLC点云滤波

news2025/1/16 1:33:33

   在获取点云数据时,由于设备精度、操作者经验、环境因素等带来的影响,以及电磁波衍射特性、被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中将不可避免地出现一些噪声点。实际应用中除了这些测量随机误差产生的噪声点之外,由于受到外界干扰如视线遮挡、障碍物等因素的影响,点云数据中往往存在着一些离主体点云较远的离散点,即离群点。不同的获取设备点云噪声结构也有不同。

    通过滤波完成的功能还包括孔洞修复、最小信息损失的海量点云数据压缩处理等 。在点云处理流程中滤波处理作为预处理的第一步,往往对后续处理流程影响很大,只有在滤波预处理中将噪声点、离群点、孔洞、数据压缩等 按照后续需求处理,才能够更好地进行配准、特征提取、曲面重建、可视化等后续流程。

    PCL 中点云滤波模块提供了很多灵活实用的滤波处理算法,例如双边滤波、高斯滤波、条件滤波、直通滤波、基于随机采样一致性滤波RANSAC等。

1 直通滤波

    直通滤波就是,用户设置一个范围,直通滤波可以取出范围之内或之外的点。

    下面是一个示例:

 


#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>
typedef pcl::PointXYZ PointT;
int main(int argc, char **argv) {
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filteredNe(new pcl::PointCloud<pcl::PointXYZ>);

    // Fill in the cloud data
    cloud->width = 100;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);
    for (size_t i = 0; i < cloud->points.size(); ++i) {
        cloud->points[i].x = 2 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 2 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 2 * rand() / (RAND_MAX + 1.0f);
//        std::cerr<< cloud->points[i].x<<" "<< cloud->points[i].y<<" "<< cloud->points[i].z<< std::endl;
    }
    std::cerr << "Cloud before filtering: " << cloud->points.size()<< std::endl;

    // Create the filtering object
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);          // 1. 设置输入源
    pass.setFilterFieldName("z");       // 2. 设置过滤域名
    pass.setFilterLimits(0.0, 1.0);     // 3. 设置过滤范围,以Z方向数据未过滤范围
    pass.filter(*cloud_filtered);       // 4. 执行过滤,并将结果输出到cloud_filtered
    std::cerr << "Cloud after filtering: " << cloud_filtered->points.size()<< std::endl;

    // Create the filtering object
    pcl::PassThrough<pcl::PointXYZ> passne;
    passne.setInputCloud(cloud);          // 1. 设置输入源
    passne.setFilterFieldName("z");       // 2. 设置过滤域名
    passne.setFilterLimits(0.0, 1.0);     // 3. 设置过滤范围
    passne.setNegative(true);             // 设置后得到的点是
    passne.filter(*cloud_filteredNe);       // 4. 执行过滤,并将结果输出到cloud_filtered
    std::cerr << "Cloud after filteringNE: " << cloud_filteredNe->points.size()<< std::endl;

    //
    pcl::visualization::PCLVisualizer viewer ("Correspondence Grouping");//对应组
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud_filtered, 255, 0, 0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud_filtered, single_color, "scene_cloud");//过滤掉的点
    viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "scene_cloud");

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_colorne(cloud_filtered, 0, 255, 0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud_filteredNe, single_colorne, "scene_cloudne");//剩下的点
    viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "scene_cloudne");

    //
    viewer.setBackgroundColor(105.0/255, 105.0/255, 105.0/255);
    while (!viewer.wasStopped()) {
        viewer.spinOnce ();
    }
}

    结果如下,红色表示滤掉的点,绿色表示滤掉后剩下的点

 2 体素滤波

    点云中经常会用到的一个概念是体素(Voxel)。

    介绍体素之前先介绍一下图像像素。图像一般是按行列的像素存储的,也就是通常说的图像分辨率。对于WxH大小的图片,相当于把图片划分成如下的网格,然后每个网格里的颜色或者灰度值不同。这样就称为了一幅图像

    对应到三维空间,点云是由点组成的,通常每个点由x、y、z三个坐标组成。三个坐标对应二维图像中的灰度值。类比与二维图像,三维空间有以下几个区别:

  • 二维图像的网格是均匀分布的,而三维点云分布在三维空间,同时是非均匀分布的。

  • 二维图像相邻像素的位置坐标相差一个1单位像素,而三维点云中相邻点的间距并不是一个固定值。

    为了让三维点云也具备和二维图像一样的均匀分布,体素将整个三维空间分成一个个立体的方格。体素可以让整个三维空间分割成一个均匀分布的空间。我们可以很容易看到:

  • 如果将体素的立方体长宽高设置成最小的长度单位,这样可以让每个点都落在一个体素当中。但是这样做会导致很多体素里面并不存在一个点,并且数据量会非常大。另一方面,点云的分布没有改变,仍然是不均匀的。

  • 用一个相对大的立方体作为体素单位,尽可能使所有的体素中都有点落在里面。这样会出现一个体素里面有多个点。如果每个体素都用一个点来代表这个体素中点云的特征,那么整个点云会被下采样成均匀分布的形式。显然,体素是一个常用的点云下采样方法。

    通过体素网格实现降采样,可以减少点数量的同时,保证点云的形状特征,可以提高配准、曲面重建、形状识别等算法的速度,并保证准确性。

    下面是一个示例:

    

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
int main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);

    // 从文件读取点云图
    // Fill in the cloud data
    pcl::PCDReader reader;
    // Replace the path below with the path where you saved your file
    reader.read ("./table_scene_lms400.pcd", *cloud); // Remember to download the file first!

    std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
         << " data points (" << pcl::getFieldsList (*cloud) << ").";

    // 创建一个长宽高分别是1cm的体素过滤器,cloud作为输入数据,cloud_filtered作为输出数据
    float leftSize = 0.01f;
    // Create the filtering object
    pcl::VoxelGrid<pcl::PointXYZ> sor;
    sor.setInputCloud (cloud);
    sor.setLeafSize (leftSize, leftSize, leftSize);
    sor.filter (*cloud_filtered);

    std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
         << " data points (" << pcl::getFieldsList (*cloud_filtered) << ")."<<std::endl;

    // 将结果输出到文件
//    pcl::PCDWriter writer;
//    writer.write ("./table_scene_lms400_downsampled.pcd", *cloud_filtered);

    //
    pcl::visualization::PCLVisualizer viewer ("Correspondence Grouping");//对应组
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");//按照z字段进行渲染
    viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample");//显示点云,其中fildColor为颜色显示
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample");//设置点云大小

    //
    viewer.setBackgroundColor(105.0/255, 105.0/255, 105.0/255);
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }
}

    对比图如下:

3 离群点移除

    激光扫描通常会生成不同点密度的点云数据集。此外,测量误差会导致稀疏的异常值,从而进一步破坏结果。这会使局部点云特征(例如表面法线或曲率变化)的估计复杂化,从而导致错误的值,进而可能导致点云配准失败。通过对每个点的邻域进行统计分析,并对不符合特定条件的部分进行修整,可以解决其中一些不规则现象。

    稀疏离群值的消除基于输入数据集中点到邻居距离的分布的计算。对于每个点,我们计算从它到所有相邻点的平均距离。通过假设结果分布是具有均值和标准差的高斯分布,可以将其平均距离在由全局距离均值和标准差定义的区间之外的所有点视为离群值并从数据集中进行修剪。下图显示了稀疏离群值分析和删除的效果:原始数据集显示在左侧,结果数据集显示在右侧。数据集图显示了滤波前后每个点的邻域中平均K最近邻距离。

    实现步骤:

    查找每一个点的所有邻域点

    计算每个点到其邻居的距离dijdij,其中i=[1,...,m]i=[1,...,m]表示共m个点,j=[1,...,k]j=[1,...,k]每个点有k个邻居

    根据高斯分布d∼N(μ,σ)d∼N(μ,σ)模型化距离参数,计算所有点与邻居的μμ(距离的均值),σσ(距离的标准差),如下:

    为每一个点,计算其与邻居的距离均值∑kj=1dij

    遍历所有点,如果其距离的均值大于高斯分布的指定置信度,则移除,比如

∑kj=1dij>μ+3σ∑j=1kdij>μ+3σ or ∑kj=1dij<μ−3σ

    下面是一个示例:

 


#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
int main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filteredne (new pcl::PointCloud<pcl::PointXYZ>);

    // 从文件读取点云
    // Fill in the cloud data
    pcl::PCDReader reader;
    // Replace the path below with the path where you saved your file
    reader.read<pcl::PointXYZ> ("./table_scene_lms400.pcd", *cloud);

    std::cerr << "Cloud before filtering: " << std::endl;
    std::cerr << *cloud << std::endl;

    // 创建过滤器,每个点分析计算时考虑的最近邻居个数为50个;
    // 设置标准差阈值为1,这意味着所有距离查询点的平均距离的标准偏差均大于1个标准偏差的所有点都将被标记为离群值并删除。
    // 计算输出并将其存储在cloud_filtered中

    // Create the filtering object
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
    sor.setInputCloud (cloud);
    // 设置平均距离估计的最近邻居的数量K
    sor.setMeanK (50);
    // 设置标准差阈值系数
    sor.setStddevMulThresh (1.0);
    // 执行过滤
    sor.filter (*cloud_filtered);
    sor.setNegative (true);
    sor.filter (*cloud_filteredne);

    //
    pcl::visualization::PCLVisualizer viewer ("Correspondence Grouping");//对应组
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud_filtered, 255, 0, 0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud_filtered, single_color, "scene_cloud");//过滤掉的点
    viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "scene_cloud");

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_colorne(cloud_filteredne, 0, 255, 0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud_filteredne, single_colorne, "scene_cloudne");//剩下的点
    viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "scene_cloudne");

    //
    viewer.setBackgroundColor(105.0/255, 105.0/255, 105.0/255);
    while (!viewer.wasStopped()) {
        viewer.spinOnce ();
    }
    return (0);
}

 结果如下,绿色的点就是被滤掉的点

4 条件滤波

    条件滤波是设置不同维度滤波规则进行滤波,如半径离群值滤波。

    半径离群值滤波是用户指定邻居的个数,要每个点必须在指定半径内具有指定个邻居才能保留在PointCloud中。例如,如果指定了1个邻居,则只会从PointCloud中删除黄点。如果指定了2个邻居,则黄色和绿色的点都将从PointCloud中删除。

    下面是一个示例:

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/visualization/pcl_visualizer.h>

typedef pcl::PointXYZ PointType;
int main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);

    // Fill in the cloud data
    cloud->width = 100;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i) {
        cloud->points[i].x = 2 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 2 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 2 * rand() / (RAND_MAX + 1.0f);
    }

    int argt=1;
    if (argt == 0) {
        pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
        // build the filter
        outrem.setInputCloud(cloud);
        outrem.setRadiusSearch(0.4);
        outrem.setMinNeighborsInRadius(2);
        // apply filter
        outrem.filter(*cloud_filtered);
    } else if (argt == 1) {
        // build the condition
        pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());
        range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(
                new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
        range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(
                new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));
        // build the filter
        pcl::ConditionalRemoval<pcl::PointXYZ> condrem;
        condrem.setCondition(range_cond);
        condrem.setInputCloud(cloud);
        condrem.setKeepOrganized(true);
        // apply filter
        condrem.filter(*cloud_filtered);
    }
    std::cerr << "Cloud before filtering: " << cloud->points.size()<<std::endl;
    std::cerr << "Cloud after filtering: " << cloud_filtered->points.size()<< std::endl;

    //
    pcl::visualization::PCLVisualizer viewer ("3D Viewer");
    pcl::visualization::PointCloudColorHandlerCustom<PointType> single_color(cloud, 0, 255, 0);
    viewer.addPointCloud<PointType>(cloud, single_color, "sample cloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");

    pcl::visualization::PointCloudColorHandlerCustom<PointType> single_color2(cloud_filtered, 255, 0, 0);
    viewer.addPointCloud<PointType>(cloud_filtered, single_color2, "sample cloud 2");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud 2");

    viewer.setBackgroundColor(105.0/255, 105.0/255, 105.0/255);
    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }
    return (0);
}

  条件滤波结果如下,绿色是被滤掉的点,红色是剩下的点

    半径离群值滤波结果如下,绿色是被滤掉的点,红色是剩下的点

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

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

相关文章

Batch Norm 与 Layer Norm

这里写自定义目录标题1 为何要对输入数据做 Normalization2 Batch Normalization3 Layer Normalization4 实际应用参考1 为何要对输入数据做 Normalization 可以比较好的抑制梯度消失和梯度爆炸的情况 归一化技术就是让每一层的分布稳定下来&#xff0c;让后面的层能在前面层…

HashMap(一)

HashMap集合简介 HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在&#xff0c;即主要用来存放键值对。HashMap 的实现不是同步的&#xff0c;这意味着它不是线程安全的。它的key、value都可以为null。此外&#xff0c;HashMap中的映射不是有序的。 JDK1…

灵活就业潮带热职业技能培训,河南00后Python学习人数翻倍

前言 短视频带货、直播带货、在线接单修图、开工作室……时间自由、收入更高的灵活就业&#xff0c;正在成为年轻人的就业新选择&#xff0c;职业技能培训焦点也在转移。5月12日&#xff0c;腾讯课堂数据显示&#xff0c;近半年&#xff08;2021年11月至2022年4月&#xff09;…

主键顺序影响——如何优化 ClickHouse 索引(二)

回顾一下上一篇文章&#xff0c;ClickHouse 的存储设计&#xff0c;从存储目录出发&#xff0c;讲 ClickHouse 的数据读取&#xff1a; 第一阶段&#xff0c;通过隐含的 granule 单位读取主键索引 idx 文件通过二分搜索过滤不需要的 Granule&#xff0c;再关联对应的 mk2 文件…

elasticsearch7.17 与minio集成,并快照备份与恢复

elasticsearch 7.6以支持 一、monio 1、部暑minio mkdir -p /data/minio/{data,config}cat > /data/minio/start.sh << EOF docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ --restartalways \ -e "MINIO_ROOT_USERadmin" \ -e "MINI…

Linux学习01-Linux基础认知

笔记来源于鸟哥的Linux私房菜&#xff08;第四版&#xff09;&#xff0c;这本书写的真的非常好。 1 简介 早期的Linux是针对386的计算来开发的&#xff0c;由于Linux只是一个操作系统&#xff0c;并不含有其他的应用程序&#xff0c;因此很多工程师在下载了Linux内核并安装&a…

【Linux】进程的程序替换(execl、execlp、execle、execvpe等替换函数)

文章目录1、进程程序替换1.1 理解进程替换原理1.2 进程相应替换函数1.3 进一步理解程序替换1、进程程序替换 父进程创建子进程的目的&#xff1a; 1.想让子进程执行父进程代码的一部分。&#xff08;子承父业&#xff09; 2.想让子进程执行一个全新的程序。   进程程序替换讨…

深圳大学数学文化赏析MOOC第一次作业答案(满分)

一、单选题 (共 40.00 分) 1. 关于归纳推理&#xff0c;以下说法错误的是 A. 归纳推理是从特殊到一般的推理。 B. 归纳推理属于发散性思维。 C. 归纳推理的结论一定是正确的。 D. 归纳推理具有创新性。 满分&#xff1a;2.00 分 得分&#xff1a;2.00 分 你的答案&a…

[MySQL]-数据库恢复工具之binlog2sql

[MySQL]-数据库恢复工具之binlog2sql 森格 | 2022年12月 本文主要介绍工具binlog的使用&#xff0c;它可以帮助我们快速解析出原始SQL、回滚SQL、去除主键的INSERT SQL等。 一、工具介绍 1.1 概述 我们可以去设想&#xff0c;当开发人员使用了delete语句误删除了某表的数据&…

微服务实用篇5-分布式搜索elasticsearch篇1

今天的主要学习任务是分布式搜索&#xff0c;首先了解elasticsearch&#xff0c;然后学习索引库的操作、文档的操作、RestAPI等。elasticsearch是非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速定位到我们需要的内容。这一篇主要学习ES的基本使用&#xff0c…

rocketmq源码-关于消费者push模式和pull模式的对比

在rocketmq中&#xff0c;对于消费者而言&#xff0c;有两种模式&#xff0c;push和pull 我在没有看源码之前&#xff0c;看其他博客的时候&#xff0c;大部分的说法是&#xff1a; mq中有两种获取消息的模式&#xff0c;一种是push&#xff0c;一种是pull&#xff1b;pull这种…

技术人员必备的便携版卸载清理工具 - Uninstall Tool 3 便携版直接U盘中启动软件,专为单个用户在多台电脑上使用而设计的。

Uninstall Tool &#xff0c;快速、强大的卸载清理软件&#xff0c;可完全彻底删除已安装软件。彻底删除不需要的应用程序&#xff0c;实时安装监视器。控制在系统启动时运行的应用。有效&#xff0c;强大的应用程序&#xff0c;具有简单而直观的界面。 删除不需要的软件&#…

马斯克都不懂的 GraphQL,API 网关又能对其如何理解?

作者&#xff0c;罗泽轩 上个月马斯克评论 Twitter App 滥用 RPC 后&#xff0c;与一些 Twitter 的技术主管发生了矛盾 —— 直言马斯克不懂技术。那这个马斯克都不懂的 GraphQL 到底是什么&#xff1f; 什么是 GraphQL&#xff1f;它有多流行&#xff1f; GraphQL 是一套由 F…

【javascript】值,类型,变量,函数,noi103题目,if语句,调试

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录基本类型NumberStringboolean例子变量求二元一次方程函数1.3题目if例子1.4题目调试下面我们会随着…

SpringMVC:SpringMVC五种类型参数传递(4)

请求参数1. 环境准备2. 参数传递2.1 GET请求2.1.1 GET发送一个参数2.1.2 GET发送多个参数2.1.3 GET请求中文乱码2.2 POST请求2.2.1 POST发送一个参数2.2.2 POST发送多个参数2.2.3 POST请求中文乱码问题3. 五种类型参数传递3.1 普通参数3.2 POJO类型参数3.3 嵌套POJO类型参数3.4…

HashMap(二)扩容

想要了解HashMap的扩容机制你要有这两个问题 1、什么时候才需要扩容 2、HashMap的扩容是什么 1、什么时候才需要扩容 当HashMap中的元素个数超过数组大小&#xff08;数组长度&#xff09;* loadFactor(负载因子)时&#xff0c;就会进行数组扩容&#xff0c;loadFactor的默认值…

Pytest框架运行常用参数解析

-s&#xff1a;表示输出调试信息&#xff0c;用于显示测试函数中print()打印的信息。我们在用例中加上一句 print(driver.title)&#xff0c;我们再运行一下我们的用例看看&#xff0c;调试信息输出-v&#xff1a;未加前只打印模块名&#xff0c;加v后--verbose打印类名、模块名…

Java中的八大包装类(Wrapper)

目录 一、八大包装类 1、八大包装类的体系图&#xff1a; 二、装箱和拆箱 三、intValue()和valueOf()方法 1、intValue() 2、valueOf() 四、包装类型和String类型的相互转换 五、包装类的常用方法&#xff08;以Integer和Character为例&#xff09; 一、八大包装类 包装…

Scala环境搭建

目录1&#xff09;安装步骤2&#xff09;测试3&#xff09;IDEA安装Scala 插件1&#xff09;安装步骤 1.首先确保 JDK1.8 安装成功 2.下载对应的 Scala 安装文件 scala-2.x.zip 3.解压 scala-2.12.11.zip&#xff0c;我这里解压到 F:\software 4.配置 Scala 的环境变量 …

使用Python和GDAL处理遥感影像数据超详细教程

提示&#xff1a;文章末尾有强化学习代码资源 : ) 前言 在本教程中&#xff0c;我们将学习使用 Python 和地理空间数据抽象库 GDAL 自动处理栅格数据的基本技术。 栅格文件通常用于存储地形模型和遥感数据及其衍生产品&#xff0c;例如植被指数和其他环境数据集。 栅格文件往往…