当前位置: 首页 > news >正文

PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化

1、PCL点云库中点云特征综述  

1.1、点云特征综述

        点云特征描述在三维数据处理领域扮演着至关重要的角色,它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中,我们可以看到基于几何形状的特征、基于统计信息的特征以及基于变换域的特征这三种主要类别。几何形状特征,例如法线和曲率等,能够直观地揭示点云数据中各个点的局部结构信息;而统计信息特征,如分布直方图和协方差矩阵等,从宏观层面描述了点云数据的整体特性;变换域特征,例如傅里叶变换和小波变换等,通过频域分析的方法来揭示点云数据中隐藏的深层次信息。随着深度学习技术的不断进步,基于神经网络的特征提取方法也逐渐成为研究的热点,并且在特征表达能力方面展现出了巨大的潜力。通过综合运用这些不同的特征描述方法,我们可以显著提高点云数据处理的精度和应用的广泛性。

        在PCL库它已支持多种特征描述子,其中法线特征描述子是基础且关键的一种。法线特征描述了点云中每个点的表面方向,对于后续的点云处理任务,如表面重建、分割和识别等,具有不可替代的重要作用。它为点云数据的进一步分析提供了重要的几何信息,是许多高级点云处理任务的基础。

        除了法线特征,PCL库还引入了FPFH(Fast Point Feature Histograms)特征描述子,这是一种基于点与其邻域点之间几何关系的特征描述方法。FPFH通过计算点与其邻域点之间的法线夹角和距离分布,生成一个直方图来描述点的局部特征。FPFH特征描述子因其计算速度快、特征描述能力强等优点,被广泛应用于点云的配准、识别和分类等任务中。它能够有效地捕捉点云数据中的局部结构信息,为点云数据的进一步处理提供了有力的工具。

        SHOT(Signature of Histograms of OrienTations)是另一种在点云处理领域中具有重要地位的特征描述子。SHOT特征描述子结合了点的法线信息和局部几何信息,通过计算点与其邻域点之间的法线夹角和距离分布,生成一个高维的特征向量。SHOT特征描述子具有旋转不变性和良好的描述能力,对于点云的识别和分类等任务具有较高的准确性。它在处理具有复杂几何结构的点云数据时,能够提供更为丰富和精确的特征信息。

        借助PCL库中的这些特征描述子,研究人员和工程师可以进一步实现点云数据的分类、识别和三维重建等高级任务。例如,通过计算点云中每个点的FPFH或SHOT特征,可以训练出高效的分类器对点云进行准确的分类;或者利用这些特征进行点云的配准和三维重建,实现更精确的三维模型构建。通过充分利用PCL库中的特征描述子,可以有效地捕捉点云数据的局部和全局特性,从而实现点云数据的分类、识别和三维重建等高级任务,为三维数据处理领域带来更多的可能性和应用前景。

1.2、PCL库中的特征实现

    PCL库中的特征模块在feature文件中,重要的基础模块在文件#include <pcl/features/feature.h>中,是所有点云特征描述信息的基类,其他高级特征在此类上继承扩展开。文件中包含主要内容有两个平面参数估计函数void solvePlaneParameters (const Eigen::Matrix3f &covariance_matrix,....)和特征基类class Feature、法向量特征基类class FeatureFromNormals,此基类非常重要;特征标签基类class FeatureFromLabels和局部参考系特征基类class LocalReferenceFrames。下面仅对class Feature基类从主要的成员变量和函数进行简要的说明。

        1、主要的成员变量

              1).特征名称

       std::string feature_name_;

              2).K邻域的搜索方法 

       SearchMethodSurface search_method_surface_;

              3).K邻域的搜索时的点云数据 

       PointCloudInConstPtr surface_;

              4).KDtree搜索方法对象 

       KdTreePtr tree_;

              5).搜索的参数(如半径R或者K) 

      double search_parameter_;

             6).K邻域的的半径

      double search_radius_;

             7).K邻域的的K值 

       int k_;

             8).是否提供额外构建搜索的点云数据,如果为false,这用原的点云数据

       bool fake_surface_;

           2、主要成员函数

            1).设置K邻域的的半径R值

     inline void setRadiusSearch (double radius);

             2).设置K邻域的的K值 

     inline void setKSearch (int k);

             3).设置搜索方法 

     inline void setSearchMethod ;

             4).设置额外提供的点云数据 

     inline void setSearchSurface (const PointCloudInConstPtr &cloud)

             5).计算特征的公共接口,其他子类通过继承、多态的方式来完成特征计算

     void compute (PointCloudOut &output);

             6).在特征计算前执行安全检测,如点云数据是否为空,相关参数是否初始化,如KDtree

     initCompute ();

            7).在特征计算后执行参数状态重置,如相关内存情况

     virtual bool deinitCompute ();

            8).对来自setsearch方法搜索k个最近邻域的实现 

     inline intsearchForNeighbors (std::size_t index, double parameter,std::vector<int> &indices, std::vector<float> &distances) const;

           9).为纯虚函数,子类实现具体的特征计算

     virtual void computeFeature (PointCloudOut &output) = 0;

2、法向量特征估计

2.1、算法原理

        点云法向量估计的原理主要基于局部表面拟合的思想,示意如图1。首先,在点云数据中选择一个待估计法向量的点作为中心点,然后在其邻域内选取一定数量的邻近点。通过这些邻近点,可以构建一个局部坐标系,并使用最小二乘法拟合出一个局部平面。该平面的法向量即为所求的中心点的法向量。具体步骤包括邻域点的选取、局部平面的拟合以及法向量的计算和归一化。此外,为了提高估计的准确性和鲁棒性,通常还会引入权重因子,以考虑邻域点与中心点之间的距离和分布情况。通过这种方法,能够有效地从无序的点云数据中提取出表面的法向信息,为后续的点云处理和分析提供重要的基础数据。

图1 

        在PCL点云库采样的是主成分分析方法(PCA Principal Component Analysis)来拟合局部平面实现点云法向量特征信息的估计,具体的实现步骤如下: 

        1)、点的局部邻域构建

        选择点pi,搜索构建其K邻域的点云集Pj,其中j=[1,....,k] 为邻域点的索引。

        2)、计算局部邻域点云的协方差矩阵

                第1步:计算邻域点云的均值

                第2步:计算每个点相对均值的偏移量 

                第3步:构建协方差矩阵C  

          3)、求解协方差矩阵的特征值和特征向量

                特征向量表示数据分布的方向,特征值表示在方向上的分布大小。

          4)、最小特征值对应的特征向量为法向量

                在局部切平面上,PCA求解的最小特征值对应的特征向量就该点的法向量,这是因为协方差C最小特征值对应的特征向量表示点云在这个方向上的分布小,即垂直于切平面的方向,因此可以近似的表示该点的法向量。

           5)、法向量方向的确定

                通过上面求的法向量的方向是杂乱的如图2,而在实际的工作中我们常希望法向量方向统一朝外或朝内,例如在渲染时法向量的方向由为重要,因为法向量的方向了决定渲染光源的方向,不同的光源方向渲染可视化不一样。在PCL库提供了根据当前帧视点来统一法向量方向的方法,具体操作如下公式:

               如果α的值小于0,则表示与视点的方向相反,需要将法向量的方向取反。通过该方法可以对法向量方向就行统一化效果如图3,但是效果不是太好,更专业的可以用最小生成树法,具体怎么执行这里不展开。

图2 

图3 

2.2、主要成员函数和变量

        1、主要的成员变量

        1)、法向量方向的统一朝向的视点,默认为(0,0,0)

      float vpx_, vpy_, vpz_;

         2)、局部领域点的协方差矩阵

    EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix_;

        3)、局部领域点的中心点

    Eigen::Vector4f xyz_centroid_;

       4)、是否用传感器提供的源点作为视点

    bool use_sensor_origin_;

        2、主要成员函数

          1)、最小二乘法估计点的法向量

  inline boolcomputePointNormal (const pcl::PointCloud<PointInT> &cloud, const std::vector<int> &indices,Eigen::Vector4f &plane_parameters, float &curvature);inline boolcomputePointNormal (const pcl::PointCloud<PointInT> &cloud, const std::vector<int> &indices,float &nx, float &ny, float &nz, float &curvature);

       2)、设置要估计法向量的点云数据

    inline voidsetInputCloud (const PointCloudConstPtr &cloud) override

      3)、设置视点值  

    inline voidsetViewPoint (float vpx, float vpy, float vpz)

2.3、主要部分代码注解

           1、法向量估计主要部分

 template <typename PointInT, typename PointOutT> void
pcl::NormalEstimation<PointInT, PointOutT>::computeFeature (PointCloudOut &output)
{//K邻域搜索需要参数的初始化std::vector<int> nn_indices (k_);std::vector<float> nn_dists (k_);output.is_dense = true;// 如果点云为稠密,则不检查每个点的NaN/Inf值可以节省时间if (input_->is_dense){// 对每一个点进行操作for (std::size_t idx = 0; idx < indices_->size (); ++idx){//1.执行最近邻域搜索//2.当前点的法向量估计if (this->searchForNeighbors ((*indices_)[idx], search_parameter_, nn_indices, nn_dists) == 0 ||!computePointNormal (*surface_, nn_indices, output.points[idx].normal[0], output.points[idx].normal[1], output.points[idx].normal[2], output.points[idx].curvature)){//3.输出法向量结果output.points[idx].normal[0] = output.points[idx].normal[1] = output.points[idx].normal[2] = output.points[idx].curvature = std::numeric_limits<float>::quiet_NaN ();output.is_dense = false;continue;}//4.法向量方向的确定flipNormalTowardsViewpoint (input_->points[(*indices_)[idx]], vpx_, vpy_, vpz_,output.points[idx].normal[0], output.points[idx].normal[1], output.points[idx].normal[2]);}}else{// Iterating over the entire index vectorfor (std::size_t idx = 0; idx < indices_->size (); ++idx){//0.无效点的识别判断//1.执行最近邻域搜索//2.当前点的法向量估计if (!isFinite ((*input_)[(*indices_)[idx]]) ||this->searchForNeighbors ((*indices_)[idx], search_parameter_, nn_indices, nn_dists) == 0 ||!computePointNormal (*surface_, nn_indices, output.points[idx].normal[0], output.points[idx].normal[1], output.points[idx].normal[2], output.points[idx].curvature)){//3.输出法向量结果output.points[idx].normal[0] = output.points[idx].normal[1] = output.points[idx].normal[2] = output.points[idx].curvature = std::numeric_limits<float>::quiet_NaN ();output.is_dense = false;continue;}//4.法向量方向的确定flipNormalTowardsViewpoint (input_->points[(*indices_)[idx]], vpx_, vpy_, vpz_,output.points[idx].normal[0], output.points[idx].normal[1], output.points[idx].normal[2]);}}
}

               2、单个点法向量估计

template <typename PointT> inline boolcomputePointNormal (const pcl::PointCloud<PointT> &cloud, const std::vector<int> &indices,Eigen::Vector4f &plane_parameters, float &curvature){// 邻域点的协方差矩阵EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix;// 邻域点的均值Eigen::Vector4f xyz_centroid;// 1.协方差矩阵和均值的计算if (indices.size () < 3 ||computeMeanAndCovarianceMatrix (cloud, indices, covariance_matrix, xyz_centroid) == 0){plane_parameters.setConstant (std::numeric_limits<float>::quiet_NaN ());curvature = std::numeric_limits<float>::quiet_NaN ();return false;}// 2.切平面法向估计作为当前点的法向量solvePlaneParameters (covariance_matrix, xyz_centroid, plane_parameters, curvature);return true;}

              3、法向量方向的确定

template <typename PointT, typename Scalar> inline voidflipNormalTowardsViewpoint (const PointT &point, float vp_x, float vp_y, float vp_z,Eigen::Matrix<Scalar, 4, 1>& normal){Eigen::Matrix <Scalar, 4, 1> vp (vp_x - point.x, vp_y - point.y, vp_z - point.z, 0);// 计算法向量与视点之间的夹角float cos_theta = vp.dot (normal);// 夹角大小判断if (cos_theta < 0){//法向量方向取反normal *= -1;normal[3] = 0.0f;// Hessian form (D = nc . p_plane (centroid here) + p)normal[3] = -1 * normal.dot (point.getVector4fMap ());}}

2.4、算法使用示例

/*****************************************************************//**
* \file   PCLFeatureNormalmain.cpp
* \brief  
*
* \author YZS
* \date   January 2025
*********************************************************************/
#include<iostream>
#include <vector>
#include <ctime>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/auto_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/features/normal_3d.h>//法向量计算头文件
using namespace std;
void PCLNoramls()
{//加载点云数据pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new  pcl::PointCloud<pcl::PointXYZRGB>());std::string fileName = "E:/PCLlearnData/12/fragment.pcd";pcl::io::load(fileName, *cloud);std::cout << "Cloud Size:" << cloud->points.size() << std::endl;//法向量估计器对象pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;ne.setInputCloud(cloud);//创建搜索方法KDtreepcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new  pcl::search::KdTree<pcl::PointXYZRGB>());ne.setSearchMethod(tree);//法向量结果pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new  pcl::PointCloud<pcl::Normal>);//设置领域搜索半径ne.setRadiusSearch(0.02);//特征计算ne.compute(*cloud_normals);std::cout << "filter Cloud Size:" << cloud_normals->points.size() << std::endl;//法向量结果可视化// PCLVisualizer对象pcl::visualization::PCLVisualizer viewer("FeatureVIS");//创建左右窗口的ID v1和v2int v1(0);int v2(1);//设置V1窗口尺寸和背景颜色viewer.createViewPort(0.0, 0.0, 0.5, 1, v1);viewer.setBackgroundColor(0, 0, 0, v1);//设置V2窗口尺寸和背景颜色viewer.createViewPort(0.5, 0.0, 1, 1, v2);viewer.setBackgroundColor(0.1, 0.1, 0.1, v2);// 添加2d文字标签viewer.addText("v1", 10, 10, 20, 1, 0, 0, "Txtv1", v1);viewer.addText("v2", 10, 10, 20, 0, 1, 0, "Txtv2", v2);//设置cloud1的渲染属性,点云的ID和指定可视化窗口v1viewer.addPointCloud(cloud, "cloud1", v1);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,  2, "cloud1");//设置法向量结果的渲染到V2窗口中viewer.addPointCloud(cloud, "cloud2", v2);viewer.addPointCloudNormals<pcl::PointXYZRGB,pcl::Normal>(cloud,cloud_normals,3,0.1f,  "cloud2n", v2);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,  2, "cloud2");// 可视化循环主体while (!viewer.wasStopped()){viewer.spinOnce();}
}
int main(int argc,char *argv[])
{PCLNoramls();std::cout<<"Hello PCL World!"<<std::endl;std::system("pause");return 0;
}

结果:

3、法向量信息可视化 

        代码如下:

//设置法向量结果的渲染到V2窗口中viewer.addPointCloud(cloud, "cloud2", v2);viewer.addPointCloudNormals<pcl::PointXYZRGB,pcl::Normal>(cloud,cloud_normals,3,0.1f,  "cloud2n", v2);

        结果:

至此完成第十三节PCL库点云特征之点云法向量及其可视化学习,下一节我们将进入《PCL库中点云特征之PFH特征描述》的学习。 

相关文章:

PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化

1、PCL点云库中点云特征综述 1.1、点云特征综述 点云特征描述在三维数据处理领域扮演着至关重要的角色&#xff0c;它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中&#xff0c;我们可以看到基于几何形状的特征、基于统计信息的特征以及…...

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称&#xff0c;这是一个处理线程的工具包&#xff0c;从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 &#xff08;1&#xff09;进程 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源…...

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

大家觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架&#xff0c;能显著加速 I/O 密集型应用的性能。 但如果你的应用已经在使用 传统 Linux AIO 了&#xff0c;并且使用方式恰当&…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验

一&#xff0c;启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...

DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计

目录标题 Open HTTP Redirectlow源码审计 medium源码审计 high源码审计 impossible源码审计 Open HTTP Redirect HTTP 重定向&#xff08;HTTP Redirect Attack&#xff09;是一种网络&#xff0c;利用 HTTP 协议中的重定向机制&#xff0c;将用户引导至恶意网站或非法页面&am…...

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…...

Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module&#xff0c;Flutter依赖了第三方库&#xff0c;Gradle是8.0版本。 编译报错&#xff1a; 解决办法是在.android根目录下的build.gradle下新增一行代码&#xff1a; buildscript {ext.kotlin_version "1.8.22"repositories {google()…...

ubuntu支持ssh

Ubuntu 默认是支持 SSH 的&#xff0c;但通常并不会在安装时启用 SSH 服务。为了能够远程连接到 Ubuntu 系统&#xff0c;需要安装并启动 SSH 服务器&#xff08;即 OpenSSH&#xff09;。以下是如何在 Ubuntu 系统中启用和配置 SSH 服务的步骤&#xff1a; 检查 SSH 是否已安…...

浏览器书签智能分类

浏览器书签智能分类工具 最近发现浏览器的书签越来越乱了&#xff0c;主要是因为自己太懒&#xff0c;其次之前建的分类太多又乱&#xff0c;重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。 项目简介 本工具用于自动整理浏览器书签&…...

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…...

Redis 深度解析:从入门到精通

引言 Redis 是一个开源的、高性能的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;并且提供了丰富的功能和接口。作为内存数据库&#xff0c;Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…...

【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)

【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码&#xff08;二&#xff09; 【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度…...

论文解读之learning to summarize with human feedback

最近在看大模型训练相关的论文&#xff0c;预计会追溯经典的和最新的训练策略以及微调原理等 本次解读经典论文learning to summarize with human feedback 一、简介 部分生成任务需要对齐人类偏好&#xff0c;但是根据最大化可能性&#xff08;对数似然&#xff09;进行微调…...

STM32学习(六 )

串口初始化IO引脚 串口的引脚在哪里 串口可以利用GPIO_InitTypeDef结构体和GPIO_Init&#xff08;&#xff09;函数进行初始化 USART_InitTypeDef USART_InitStruct;//建立串口结构体USART_InitStruct.USART_BaudRate 115200;//波特率115200USART_InitStruct.USART_Mode US…...

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中&#xff0c;Issue 和 Pull Request&#x…...

56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息

前言 在现代 Web 开发中&#xff0c;地图应用越来越成为重要的组成部分。OpenLayers 是一个功能强大的 JavaScript 地图库&#xff0c;它提供了丰富的地图交互和操作功能&#xff0c;而 Vue 3 是当前流行的前端框架之一。在本篇文章中&#xff0c;我们将介绍如何在 Vue 3 中集…...

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…...

elementui table 表格 分页多选,保持选中状态

elementui多选时分页&#xff0c;解决选中状态无法保留选中项问题&#xff1a; 在el-table标签中加入row-key&#xff0c;row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后&#xff0c;将需要清空的地方 ( 如返回…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...