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

点云处理中阶 Octree模块

一、什么是Octree

      八叉树(Octree)是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中心。且每个节点可以继续分割,直到满足某个条件(如达到最大深度或最小点数)。这种结构特别适合于稀疏点云数据的处理,能够高效地进行空间查询和操作。

实现八叉树的原理 

  (1). 设定最大递归深度。

  (2). 找出场景的最大尺寸,并以此尺寸建立第一个立方体。

  (3). 依序将单位元元素丢入能被包含且没有子节点的立方体。

  (4). 若没达到最大递归深度,就进行细分八等份,再将该立方体所装的单位元元素全部分担给八个子立方体。

  (5). 若发现子立方体所分配到的单位元元素数量不为零且跟父立方体是一样的,则该子立方体停止细分,因为跟据空间分割理论,细分的空间所得到的分配必定较少,若是一样数目,则再怎么切数目还是一样,会造成无穷切割的情形。

  (6). 重复3,直到达到最大递归深度。

二、八叉树应用

1、点云压缩

      点云由巨大的数据集组成,这些数据集描述了三维点,并与诸如距离、颜色、法线等附加信息相关联。此外,它们可以以很高的速率创建,因此占用大量的内存资源。一旦点云必须在速率有限的通信信道上存储或传输,压缩这类数据的方法就变得非常有趣了。

      点云库提供点云压缩功能。它允许编码所有类型的点云,包括无序的点云,其特征是不存在的点引用,不同的点大小,分辨率,密度和/或点顺序。

      此外,底层八叉树数据结构能够有效地合并来自多个来源的点云数据。

      以下示例演示如何有效地压缩单点云以及点云流。

压缩单点云

  1. 几何压缩

    • Octree编码:将空间分割成八个子区域,递归进行,直到每个节点包含的点数少于某个阈值。使用八叉树结构可以有效减少存储需求。
    • KD树编码:通过平衡树结构将点云分割,并按层次顺序存储,可以较好地压缩数据。
  2. 基于变换的压缩

    • 主成分分析 (PCA):对点云数据进行主成分分析,将点云数据投影到主成分上,减少维度,从而达到压缩的目的。
    • 离散余弦变换 (DCT)小波变换:将点云数据转变到频域,利用能量集中在低频部分的特性,舍弃高频部分,实现压缩。
  3. 点位置编码

    • 量化:将点的坐标值进行量化,可以在一定程度上减少数据量。
    • 预测编码:使用点的邻域信息预测当前点的位置,仅存储预测误差,从而减少存储量。

压缩点云流

  1. 时间冗余压缩

    • 帧间差分编码:仅存储相邻帧之间的差异,而不是每一帧的完整数据。可以大大减少数据量。
    • 运动估计和补偿:通过估计点云流中的运动矢量,只存储运动矢量和补偿信息。
  2. 基于模型的压缩

    • 动态几何模型:利用物体的运动模型(如刚体运动模型、骨架动画等)来预测点的位置,只存储模型参数。
    • 稀疏表示:使用稀疏矩阵或张量表示点云流,存储非零元素及其索引。
  3. 空间和时间联合压缩

    • 四维(3D空间+时间)Octree编码:将时间维度加入Octree结构,实现空间和时间的联合压缩。
    • 时空小波变换:对点云流进行时空小波变换,利用点云流在时空域的稀疏性进行压缩。
  4. 机器学习方法

    • 自编码器:使用神经网络的自编码器结构学习点云数据的低维表示,从而实现压缩。
    • 生成对抗网络(GANs):利用GAN生成逼真的点云数据,可以仅存储生成器的模型参数,而不是所有点数据。

示例一(进行压缩和解压缩)

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/octree_pointcloud_compression.h>int main(int argc, char** argv) {// 创建一个点云对象pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>());pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZRGBA>());// 生成一些示例点云数据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 = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].r = rand() % 256;cloud->points[i].g = rand() % 256;cloud->points[i].b = rand() % 256;cloud->points[i].a = 255;}// 初始化点云压缩和解压缩对象pcl::io::compression_Profiles_e compressionProfile = pcl::io::HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR;bool showStatistics = true;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> PointCloudEncoder(compressionProfile, showStatistics);pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> PointCloudDecoder;// 压缩点云std::stringstream compressedData;PointCloudEncoder.encodePointCloud(cloud, compressedData);// 解压缩点云PointCloudDecoder.decodePointCloud(compressedData, cloudOut);// 打印压缩和解压缩后的点云数据std::cout << "Original Point Cloud: " << std::endl;for (size_t i = 0; i < cloud->points.size(); ++i) {std::cout << "    " << cloud->points[i] << std::endl;}std::cout << "Decompressed Point Cloud: " << std::endl;for (size_t i = 0; i < cloudOut->points.size(); ++i) {std::cout << "    " << cloudOut->points[i] << std::endl;}return 0;
}

示例二(OpenNI兼容设备)

下面的代码为OpenNI兼容设备实例化一个新的采样器,并且启动循环回调接口,每从设备获取一帧数据就回调函数一次,,这里的回调函数就是实现数据压缩和可视化解压缩结果。

出处:PCL学习八叉树 - Being_young - 博客园 (cnblogs.com)

#include <pcl/point_cloud.h>                         // 点云类型
#include <pcl/point_types.h>                          //点数据类型
#include <pcl/io/openni_grabber.h>                    //点云获取接口类
#include <pcl/visualization/cloud_viewer.h>            //点云可视化类#include <pcl/compression/octree_pointcloud_compression.h>   //点云压缩类#include <stdio.h>
#include <sstream>
#include <stdlib.h>#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endifclass SimpleOpenNIViewer
{
public:SimpleOpenNIViewer () :viewer (" Point Cloud Compression Example"){}
/************************************************************************************************在OpenNIGrabber采集循环执行的回调函数cloud_cb_中,首先把获取的点云压缩到stringstream缓冲区,下一步就是解压缩,它对压缩了的二进制数据进行解码,存储在新的点云中解码了点云被发送到点云可视化对象中进行实时可视化
*************************************************************************************************/void  cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud){if (!viewer.wasStopped ()){// 存储压缩点云的字节流对象std::stringstream compressedData;// 存储输出点云pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZRGBA> ());// 压缩点云PointCloudEncoder->encodePointCloud (cloud, compressedData);// 解压缩点云PointCloudDecoder->decodePointCloud (compressedData, cloudOut);// 可视化解压缩的点云viewer.showCloud (cloudOut);}}
/**************************************************************************************************************在函数中创建PointCloudCompression类的对象来编码和解码,这些对象把压缩配置文件作为配置压缩算法的参数所提供的压缩配置文件为OpenNI兼容设备采集到的点云预先确定的通用参数集,本例中使用MED_RES_ONLINE_COMPRESSION_WITH_COLOR配置参数集,用于快速在线的压缩,压缩配置方法可以在文件/io/include/pcl/compression/compression_profiles.h中找到,在PointCloudCompression构造函数中使用MANUAL——CONFIGURATION属性就可以手动的配置压缩算法的全部参数
******************************************************************************************************************/void run (){bool showStatistics = true;  //设置在标准设备上输出打印出压缩结果信息// 压缩选项详情在: /io/include/pcl/compression/compression_profiles.hpcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;// 初始化压缩和解压缩对象  其中压缩对象需要设定压缩参数选项,解压缩按照数据源自行判断PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (compressionProfile, showStatistics);PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> ();/***********************************************************************************************************下面的代码为OpenNI兼容设备实例化一个新的采样器,并且启动循环回调接口,每从设备获取一帧数据就回调函数一次,,这里的回调函数就是实现数据压缩和可视化解压缩结果。************************************************************************************************************///创建从OpenNI获取点云的抓取对象pcl::Grabber* interface = new pcl::OpenNIGrabber ();// 建立回调函数boost::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f = boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);//建立回调函数和回调信息的绑定boost::signals2::connection c = interface->registerCallback (f);// 开始接受点云的数据流interface->start ();while (!viewer.wasStopped ()){sleep (1);}interface->stop ();// 删除压缩与解压缩的实例delete (PointCloudEncoder);delete (PointCloudDecoder);}pcl::visualization::CloudViewer viewer;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudDecoder;};int
main (int argc, char **argv)
{SimpleOpenNIViewer v;  //创建一个新的SimpleOpenNIViewer  实例并调用他的run方法v.run ();return (0);
}

示例三(官方demo)

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>#include <pcl/compression/octree_pointcloud_compression.h>#include <stdio.h>
#include <sstream>
#include <stdlib.h>#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endifclass SimpleOpenNIViewer
{
public:SimpleOpenNIViewer () :viewer (" Point Cloud Compression Example"){}voidcloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud){if (!viewer.wasStopped ()){// stringstream to store compressed point cloudstd::stringstream compressedData;// output pointcloudpcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZRGBA> ());// compress point cloudPointCloudEncoder->encodePointCloud (cloud, compressedData);// decompress point cloudPointCloudDecoder->decodePointCloud (compressedData, cloudOut);// show decompressed point cloudviewer.showCloud (cloudOut);}}voidrun (){bool showStatistics = true;// for a full list of profiles see: /io/include/pcl/compression/compression_profiles.hpcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;// instantiate point cloud compression for encoding and decodingPointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (compressionProfile, showStatistics);PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> ();// create a new grabber for OpenNI devicespcl::Grabber* interface = new pcl::OpenNIGrabber ();// make callback function from member functionstd::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f =[this] (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr& cloud) { cloud_cb_ (cloud); };// connect callback function for desired signal. In this case its a point cloud with color valuesboost::signals2::connection c = interface->registerCallback (f);// start receiving point cloudsinterface->start ();while (!viewer.wasStopped ()){sleep (1);}interface->stop ();// delete point cloud compression instancesdelete (PointCloudEncoder);delete (PointCloudDecoder);}pcl::visualization::CloudViewer viewer;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudDecoder;};int
main ()
{SimpleOpenNIViewer v;v.run ();return (0);
}

2、空间分区与点云检索

      下篇文章单独讲检索

3、点云数据空间变换检测

官网demo:Spatial change detection on unorganized point cloud data — Point Cloud Library 0.0 documentationicon-default.png?t=N7T8https://pcl.readthedocs.io/projects/tutorials/en/latest/octree_change.html#octree-change-detection

八叉树是一种基于树的数据结构,用于组织稀疏的三维数据。在本demo中,我们将学习如何使用八叉树实现来检测多个无组织点云之间的空间变化,这些变化可能在大小,分辨率,密度和点顺序上有所不同。变换检测主要用于检测点云数据中不同时间点之间的变化。这种变化检测在很多实际应用场景中非常有用,特别是需要监控环境变化或检测动态物体的领域,即识别到场景中物体的变换。

通过递归比较八叉树的树结构,可以识别由体素配置差异所代表的空间变化。

此外,我们解释了如何使用pcl八叉树“双缓冲”技术,使我们能够随着时间的推移有效地处理多个点云。

3.1 示例

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>
#include <iostream>int main() {// 定义点云类型typedef pcl::PointXYZ PointT;// 创建两个点云pcl::PointCloud<PointT>::Ptr cloudA(new pcl::PointCloud<PointT>);pcl::PointCloud<PointT>::Ptr cloudB(new pcl::PointCloud<PointT>);// 添加点到第一个点云 (cloudA)cloudA->push_back(PointT(1.0, 1.0, 1.0));cloudA->push_back(PointT(1.0, 2.0, 1.0));cloudA->push_back(PointT(1.0, 3.0, 1.0));// 添加点到第二个点云 (cloudB)cloudB->push_back(PointT(1.0, 1.0, 1.0));cloudB->push_back(PointT(1.0, 2.0, 1.0));cloudB->push_back(PointT(1.0, 3.0, 1.0));cloudB->push_back(PointT(1.0, 4.0, 1.0)); // 新增点// 创建八叉树变化检测器,设置分辨率float resolution = 0.5f;pcl::octree::OctreePointCloudChangeDetector<PointT> octree(resolution);// 将第一个点云 (cloudA) 添加到八叉树中octree.setInputCloud(cloudA);octree.addPointsFromInputCloud();// 切换到第二个点云 (cloudB)octree.switchBuffers();octree.setInputCloud(cloudB);octree.addPointsFromInputCloud();// 获取变化检测结果std::vector<int> newPointIdxVector;octree.getPointIndicesFromNewVoxels(newPointIdxVector);// 输出变化点的索引和坐标std::cout << "Points added in cloudB:" << std::endl;for (std::size_t i = 0; i < newPointIdxVector.size(); ++i) {std::cout << "Index: " << newPointIdxVector[i]<< ", Point: " << cloudB->points[newPointIdxVector[i]].x << " "<< cloudB->points[newPointIdxVector[i]].y << " "<< cloudB->points[newPointIdxVector[i]].z << std::endl;}return 0;
}

3.2 解释 

  • 定义点云类型:使用 pcl::PointXYZ 作为点云的点类型
  • 创建点云:创建两个点云 cloudAcloudB 并向其中添加点
  • 创建八叉树变化检测器:使用 pcl::octree::OctreePointCloudChangeDetector 创建八叉树变化检测器,并设置分辨率。分辨率决定了八叉树的叶子节点大小,即检测变化的精度
  • 添加第一个点云到八叉树中:将第一个点云(cloudA)添加到八叉树中
  • 切换缓冲区:调用 switchBuffers 方法,这样八叉树会保存之前点云的状态,并准备接收新的点云数据。

       OctreePointCloudChangeDetector类继承自Octree2BufBase类,后者能够同时在内存中保持和管理两个八树。此外,它实现了一个内存池,可以重用已经分配的节点对象,从而在生成多点云的八叉树时减少昂贵的内存分配和释放操作。通过调用" octree. switchbuffers() ",重置了八叉树类,同时在内存中保留了之前的八叉树结构。

  • 添加第二个点云到八叉树中:将第二个点云(cloudB)添加到八叉树中。
  • 获取变化检测结果:调用 getPointIndicesFromNewVoxels 方法,获取在第二个点云中新增的点的索引。

      为了检索存储在当前八叉树结构(基于cloudB)体素上的点,这些点在之前的八叉树结构(基于cloudA)中不存在,我们可以调用“getPointIndicesFromNewVoxels”方法,该方法返回结果点索引的向量。

  • 输出变化点:遍历新点的索引,并输出它们的坐标。

三、接口文档学习

pcl_octree库提供了从点云数据创建分层树数据结构的有效方法。这允许对点数据集进行空间分区、下采样和搜索操作。每个八叉树节点要么有八个子节点,要么没有子节点。根节点描述了一个立方体边界框,它封装了所有的点。在每个树级别,该空间被细分为2倍,从而提高体素分辨率。

pcl_octree实现提供了高效的最近邻搜索例程,如“体素内邻居搜索”、“K近邻搜索”和“半径内邻居搜索”。它会根据点数据集自动调整其尺寸。一组叶节点类提供了额外的功能,例如空间“占用”和“每体素点密度”检查。序列化和反序列化函数能够有效地将八叉树结构编码为二进制格式。此外,在需要高速创建八叉树的场景中,内存池实现减少了昂贵的内存分配和释放操作。

1、Octree模块主要类

  1. pcl::octree::OctreePointCloud<T>

    • 功能:这是 Octree 模块的基类,提供了基本的八叉树结构和功能,包括树的构建、插入、删除等操作。
    • 主要子类
      • pcl::octree::OctreePointCloudSinglePoint<T>
      • pcl::octree::OctreePointCloudPointVector<T>
      • pcl::octree::OctreePointCloudVoxelCentroid<T>
  2. pcl::octree::OctreePointCloudSinglePoint<T>

    • 功能:此类继承自 OctreePointCloud<T>,用于每个八叉树节点存储单个点。
  3. pcl::octree::OctreePointCloudPointVector<T>

    • 功能:此类继承自 OctreePointCloud<T>,用于每个八叉树节点存储一个点向量(多个点)。
  4. pcl::octree::OctreePointCloudVoxelCentroid<T>

    • 功能:此类继承自 OctreePointCloud<T>,用于每个八叉树节点存储体素(Voxel)质心。
  5. pcl::octree::OctreePointCloudSearch<T>

    • 功能:提供搜索功能,包括邻域搜索、半径搜索和 K 近邻搜索等。继承自 OctreePointCloudPointVector<T>
  6. pcl::octree::OctreePointCloudCompression<T>

    • 功能:用于点云数据的压缩和解压缩,利用八叉树结构来减少数据存储需求。

2、类之间的关系

OctreePointCloud<T> 是 Octree 模块的基类,其他类通过继承自它来实现不同的功能。具体关系如下:

  • pcl::octree::OctreePointCloud<T>:基类,定义了基本的八叉树操作。
    • pcl::octree::OctreePointCloudSinglePoint<T>:继承自 OctreePointCloud<T>,每个节点存储一个点。
    • pcl::octree::OctreePointCloudPointVector<T>:继承自 OctreePointCloud<T>,每个节点存储一个点向量。
    • pcl::octree::OctreePointCloudVoxelCentroid<T>:继承自 OctreePointCloud<T>,每个节点存储一个体素质心。
    • pcl::octree::OctreePointCloudSearch<T>:继承自 OctreePointCloudPointVector<T>,提供搜索功能。
    • pcl::io::OctreePointCloudCompression<T>:独立实现,但依赖 Octree 结构进行压缩和解压缩。

相关文章:

点云处理中阶 Octree模块

一、什么是Octree 八叉树&#xff08;Octree&#xff09;是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素&#xff0c;每个节点有八个子节点&#xff0c;这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中…...

Nginx实现负载均衡与故障检查自动切换

创作灵感来源于个人项目的一个稳定性规划&#xff0c;单节点的项目稳定性方面可能有很大的缺漏&#xff0c;因此需要升级为多节点&#xff0c;保证服务故障后&#xff0c;依然有其他服务可用&#xff0c;不会给前端用户造成影响。 &#xff08;前面讲选型&#xff0c;想直接看…...

2024年学浪视频怎么下载到手机相册

随着2024年的到来&#xff0c;学浪平台继续为广大学习者提供优质的在线教育资源。然而&#xff0c;如何将这些宝贵的视频内容下载到手机相册&#xff0c;方便随时离线观看呢&#xff1f;无论您是想在旅途中学习&#xff0c;还是希望在没有网络的情况下复习课程&#xff0c;本文…...

【北京市政府网_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

工作中的冲突,职场人士应如何化解

在职场中&#xff0c;冲突和分歧是不可避免的现象。它们可能来源于工作分配不均、目标不一致、价值观差异或个性不合等。面对这些冲突和分歧&#xff0c;我们需要具备有效的冲突管理技巧来化解问题&#xff0c;以维持团队的和谐与工作效率。 分析冲突的原因至关重要。通常来说&…...

企业级大数据平台建设方案

企业级大数据平台建设方案 方案简介硬件软件分布式存储&#xff1a;Foreman作为集群管理工具Sparkcloudera 方案简介 该方案是多年前在Roadstar.ai任职时的建设方案&#xff0c;现将方案部分细节开源&#xff0c;结合本博客的其他文章&#xff0c;能够建立可靠的企业大数据平台…...

HTML语义化标签:为何它们如此重要?

HTML语义化标签&#xff1a;为何它们如此重要&#xff1f; 引言1. HTML语义化标签的基本概念2. HTML语义化标签的作用2.1 提升网页可读性2.2 增强可访问性2.3 优化搜索引擎排名2.4 提高性能 3. 代码示例结尾讨论 引言 在前端开发的世界里&#xff0c;HTML作为构建网页的基础语…...

详细介绍一下Votenet的工作原理及流程

Votenet是一种基于深度学习的三维目标检测和实例分割方法&#xff0c;其工作原理主要包括两个步骤&#xff1a;候选框生成和目标分类与分割。 1.候选框生成&#xff1a; 首先&#xff0c;Votenet通过将三维点云数据转化为连续的坐标网格&#xff0c;将三维目标检测问题转化为二…...

使用Autofit.js和React实现自适应布局

1. 什么是Autofit.js&#xff1f; Autofit.js是一个用于自适应网页布局的JavaScript库&#xff0c;它可以根据元素的尺寸和屏幕的大小&#xff0c;自动调整布局和排列方式&#xff0c;以适应不同的设备和分辨率。它提供了简单易用的API&#xff0c;可以帮助我们轻松实现各种自…...

Kafka之【存储消息】

Kafka之【存储消息】...

鸿蒙开发配置官方地图

一共需要配置 p12 p7b cer csr 四个文件 p12文件配置 注意创建文件名必须是.p12 到AGC创建项目 AppGallery Connect 添加自己的项目名称 我没有开启 暂时不需要 看个人需求 下载刚创建的cer证书 回到我的项目中 点击刚创建的项目 点击这里 四个文件齐全了 "metadata&qu…...

《天道》丁元英格律诗商业案例完整拆解(上)

目录 公司启动缘由 我们开公司也好、做任何其他事请也罢。 1997 年 3 月&#xff1a; 北京摆摊、租店面、仓库&#xff1a; 1997 年 4 月前&#xff1a; 向斯雷克音响店下订货单&#xff1b; 1997 年 6 月&#xff1a; 格林、伦敦、巴黎三个城市当托&#xff1b; 1998 …...

2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材&#xff0c;山东省安全员C证大纲整理…...

微软开源多模态大模型Phi-3-vision,微调实战来了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…...

架构二。。

1、CAP 只能3选2 1&#xff09;一致性&#xff08;Consistency&#xff09; 客户每次读都是返回最新的写操作结果 2&#xff09;可用性&#xff08;Availability&#xff09; 非故障节点在合理的时间内返回合理的响应 3&#xff09;分区容忍性&#xff08;Partition Tolerance…...

《Google 软件工程》读书笔记

1. 写在前面 在图书馆瞎逛&#xff0c;偶然瞄见一本《Google 软件工程》Titus Winters, Tom Manshreck, Hyrum Wright 著。主要是在这一排的书架上就这本书看着挺新的&#xff08;不知道为什么有一种喜欢看新书的情节&#xff09;&#xff0c;而且最近被领导老批评&#xff0c;…...

研发机构大数据迁移如何保障敏感数据不泄露

随着云计算和大数据技术的飞速进步&#xff0c;越来越多的企业正试图通过数据迁移来提升IT基础设施的效率&#xff0c;减少成本&#xff0c;并增强业务的灵活性。但是&#xff0c;这一过程并非没有它的挑战&#xff0c;尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…...

【Spring Security系列】权限之旅:SpringSecurity小程序登录深度探索

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 姊妹篇&#xff1a; 【Spring Security系列】Spring SecurityJWTRedis实现用户认证登录及登出_spring security jwt 退出登录-CSDN博客 1. 前言 欢迎来到【Spring Security系列】&#xff01;在当今数字化…...

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险&#xff0c;我们或许需要走遍神秘空间的每个角落&#xff0c;又或许可以快速锁定目标。 在这场寻觅之旅中&#xff0c;每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…...

【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化-CSDN博客 下一篇&#xff1a; 当基表很大且未存储在存储引擎的缓存中时&#xff0c;使用辅助索引上的范围扫描读取行可能会…...

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用

一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构&#xff0c;用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示&#xff0c;ICAP原语可实现flash中n1各版本的动态切换&#xff0c;在工作过程中&#xff0c;可以通过IPROG命令切…...

MongoDB检查慢查询db.system.profile.find 分析各参数的作用

db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可…...

sendDefaultImpl call timeout(rocketmq)

rocketmq 连接异常 senddefaultimpl call timeout-腾讯云开发者社区-腾讯云 第一种情况&#xff1a; 修改broker 的配置如下&#xff0c;注意brokerIP1 这个配置必须有&#xff0c;不然 rocketmq-console 显示依然是内网地址 caused by: org.apache.rocketmq.remoting.excep…...

【区块链基础】区块链的 Fork(分叉)深度解析:原理、类型、历史案例及共识机制的影响

区块链的 Fork(分叉)全面解析:原理、类型、历史案例及共识机制的影响 在区块链技术的发展过程中,Fork(分叉)现象是不可避免且极具影响力的一个环节。理解区块链分叉的形成原因、具体表现以及共识机制对分叉的作用,对于深入把握区块链技术架构及其治理机制至关重要。 本…...

火语言RPA--界面应用详解

新建一个界面应用后&#xff0c;软件将自动弹出一个界面设计器&#xff0c;本篇将介绍下流程设计器中各部分的功能。 UI控件列表 显示软件中自带的所有UI控件流程库 流程是颗粒组件的容器&#xff0c;可在建立的流程中添加颗粒组件编写成规则流程。 流程编辑好后再绑定UI控件…...

现代C++特性(一):基本数据类型扩展

文章目录 基础数据类型long long (C 11)numeric_limits()获取当前数据类型的最值warning C4309: “”: 截断常量值新字符类型char16_t和char32_tWindows编程常用字符类型wchar_tchar8_t (C 20) 基础数据类型 C中的基本类型是构建其他数据类型的基础&#xff0c;常见的基础类型…...

接口不是json的内容能用Jsonpath获取吗,如果不能,我们选用什么方法处理呢?

JsonPath 是一种专门用于查询和提取 JSON 数据的查询语言&#xff08;类似 XPath 用于 XML&#xff09;。以下是详细解答&#xff1a; ​JsonPath 的应用场景​ ​API 响应处理​&#xff1a;从 REST API 返回的 JSON 数据中提取特定字段。​配置文件解析​&#xff1a;读取 J…...

第2章:Neo4j安装与配置

在了解了Neo4j的基本概念和优势之后&#xff0c;下一步就是将其安装并配置好&#xff0c;以便开始实际操作。本章将详细介绍Neo4j的各种部署方式&#xff0c;涵盖不同操作系统的安装步骤&#xff0c;深入探讨关键配置项&#xff0c;并介绍常用的管理工具&#xff0c;为读者顺利…...

在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署

引言&#xff1a;云原生时代的部署挑战 在云原生应用开发中&#xff0c;基础设施管理的复杂性已成为团队面临的核心挑战。随着微服务架构的普及&#xff0c;每个服务可能包含数十个AWS资源&#xff08;如Lambda、API Gateway、ECS集群等&#xff09;&#xff0c;传统的手动配置…...