PCL从理解到应用【08】 点云特征 | 法线估计 | 主曲率估计

前言

在PCL中,有多种方法和函数可以用来提取点云特征,本文介绍几何特征。

其中,几何特征主要包括法线估计主曲率估计

这些特征能够描述点云表面的几何形状,常用于进一步的点云处理和分析,如配准、分割和物体识别。

 平面的法向量估计,示例效果:

局部区域点云,法向量估计示例效果:

1、法线估计 (Normal Estimation)

法线是描述点云表面局部几何形状的基本特征之一。

PCL提供了多种方法来估计法线,以下是两种常用的方法:

  • pcl::NormalEstimation
  • pcl::IntegralImageNormalEstimation

pcl::NormalEstimation 是最常用的法线估计类

它使用给定的点云和邻域搜索方法来计算每个点的法线。以下是基本的使用步骤:

  1. 创建对象: 实例化 pcl::NormalEstimation 对象。
  2. 设置输入点云: 使用 setInputCloud() 方法设置输入点云。
  3. 设置搜索方法: 使用 setSearchMethod() 设置邻域搜索方法,如 pcl::search::KdTree
  4. 设置半径或K值: 设置用于搜索邻域的半径或最近邻数量(K值),使用 setRadiusSearch()setKSearch()
  5. 计算法线: 使用 compute() 方法计算法线。

示例代码:

pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch(0.03);
ne.compute(*cloud_normals);

pcl::IntegralImageNormalEstimation 是另一种法线估计方法

  • 特别适用于组织良好的点云(如深度图像)
  • 它使用积分图像来快速计算法线,是一种更高效的方法

示例代码:

pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);
ne.setNormalEstimationMethod(ne.AVERAGE_3D_GRADIENT);
ne.setMaxDepthChangeFactor(0.02f);
ne.setNormalSmoothingSize(10.0f);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.compute(*cloud_normals);

通常情况下,为了计算点云的法向量,需要先拟合平面或者确定点云局部的几何特征。

法向量描述了平面在三维空间中的方向,因此拟合平面是计算法向量的一个关键步骤。

具体来说,计算法向量的常见步骤包括:

  1. 定义邻域:选择一个点的邻域,即确定该点附近的一组点。这些邻域点可以通过固定半径搜索或K最近邻搜索来确定。

  2. 拟合平面:在定义的邻域中,使用平面拟合算法来确定邻域点的最佳平面。这通常涉及最小二乘法来拟合平面。

  3. 平面拟合的结果通常以平面方程的形式表示:ax+by+cz+d=0。

  4. 计算法向量:平面拟合的结果提供了平面法向量的方向。平面方程中的 (a,b,c)就是平面的法向量。

  5. 法向量归一化:将法向量归一化为单位向量,即长度为1。

2、主曲率估计 (Principal Curvature Estimation)

主曲率描述了点云表面的曲率信息,可以帮助理解表面的几何形状特征。

pcl::PrincipalCurvaturesEstimation

该类通过计算每个点的主曲率方向和值来描述点云的几何结构。主要使用步骤如下:

  1. 创建对象: 实例化 pcl::PrincipalCurvaturesEstimation 对象。
  2. 设置输入点云和法线: 使用 setInputCloud()setInputNormals() 方法设置输入点云和法线。
  3. 设置搜索方法: 设置邻域搜索方法,如 pcl::search::KdTree
  4. 计算主曲率: 使用 compute() 方法计算主曲率。

示例代码:

pcl::PrincipalCurvaturesEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> pc;
pc.setInputCloud(cloud);
pc.setInputNormals(cloud_normals);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
pc.setSearchMethod(tree);
pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr cloud_curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>);
pc.setRadiusSearch(0.05);
pc.compute(*cloud_curvatures);

3、实践案例——平面法线估计

估计一个主法向量,通常是在处理一个平面或近似平面的点云时进行的。

主法向量可以通过对点云的法线进行聚合,或者使用主成分分析(PCA)来估计整个点云的方向。

示例效果:

示例代码:

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/search/kdtree.h>
#include <Eigen/Dense>int main(int argc, char** argv)
{// 创建点云对象并生成平面点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());// 定义平面的参数,例如 z = 1.0float z_value = 1.0f;float noise_level = 0.02f; // 噪声水平// 生成位于平面上的点并添加噪声for (float x = -1.0; x <= 1.0; x += 0.05){for (float y = -1.0; y <= 1.0; y += 0.05){pcl::PointXYZ point;point.x = x + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;point.y = y + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;point.z = z_value + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;cloud->points.push_back(point);}}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;// 计算点云的质心Eigen::Vector4f centroid;pcl::compute3DCentroid(*cloud, centroid);// 构建点云的协方差矩阵Eigen::Matrix3f covariance_matrix;pcl::computeCovarianceMatrixNormalized(*cloud, centroid, covariance_matrix);// 计算协方差矩阵的特征值和特征向量Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance_matrix, Eigen::ComputeEigenvectors);Eigen::Matrix3f eigen_vectors = eigen_solver.eigenvectors();Eigen::Vector3f eigen_values = eigen_solver.eigenvalues();// 主法向量是协方差矩阵的最小特征值对应的特征向量Eigen::Vector3f main_normal_vector = eigen_vectors.col(0);// 输出主法向量std::cout << "主法向量: " << main_normal_vector.transpose() << std::endl;// 可视化pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加点云到可视化器pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");// 可视化主法向量pcl::PointXYZ centroid_point(centroid[0], centroid[1], centroid[2]);pcl::PointXYZ normal_endpoint(centroid[0] + main_normal_vector[0],centroid[1] + main_normal_vector[1],centroid[2] + main_normal_vector[2]);viewer->addArrow(normal_endpoint, centroid_point, 2.0, 0.0, 0.0, false, "main_normal");// 运行可视化器viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

代码说明:

  • 生成平面点云数据并添加噪声

    • 与之前的例子类似,生成一个位于平面上的点云,并添加随机噪声。
  • 计算质心

    • 使用 pcl::compute3DCentroid 计算点云的质心,这将作为主法向量的起点。
  • 计算协方差矩阵

    • 使用 pcl::computeCovarianceMatrixNormalized 计算点云的协方差矩阵,这是PCA的核心步骤。
  • 计算特征值和特征向量

    • 使用 Eigen 库的 Eigen::SelfAdjointEigenSolver 计算协方差矩阵的特征值和特征向量。
    • 主法向量对应于最小特征值的特征向量。
  • 可视化

    • 使用PCL可视化工具展示点云,并使用箭头显示主法向量。

4、实践案例——局部区域法线估计

使用PCL生成随机点云数据,然后进行法线估计,并使用PCL提供的可视化工具进行显示。

示例说明:

  • 生成随机点云数据:

    • 使用 rand() 函数生成随机点云数据,其中每个点的 x, y, z 坐标在 [0, 1024) 范围内。
  • 法线估计:

    • 使用 pcl::NormalEstimation 进行法线估计,设置输入点云和邻域搜索方法。
    • 设置 KSearch 为100,表示使用每个点的100个最近邻来计算法线。
  • 可视化:

    • 使用 pcl::visualization::PCLVisualizer 创建一个3D可视化窗口。
    • 使用 addPointCloud 方法将点云添加到可视化器中,并设定点云的颜色。
    • 使用 addPointCloudNormals 方法将法线添加到可视化器中,其中 10 表示显示每10个点的法线,0.05 表示法线的缩放比例。
    • viewer->spinOnce(100); 控制可视化器的刷新频率。

示例效果:

示例代码:

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/search/kdtree.h>
#include <pcl/common/common.h>int main(int argc, char** argv)
{// 创建点云对象并生成随机点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());// 随机生成1000个点for (size_t i = 0; i < 1000; ++i){pcl::PointXYZ point;point.x = 1024 * rand() / (RAND_MAX + 1.0f);point.y = 1024 * rand() / (RAND_MAX + 1.0f);point.z = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points.push_back(point);}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;// 创建法线估计对象pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;ne.setInputCloud(cloud);// 创建一个搜索树对象,并将其传递给法线估计对象pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());ne.setSearchMethod(tree);// 创建一个保存法线的点云对象pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);// 设置用于邻域搜索的K值ne.setKSearch(100);// 计算法线ne.compute(*cloud_normals);// 可视化pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加点云到可视化器pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");// 可视化法线,显示每个点的法线viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals, 10, 0.1, "normals");// 运行可视化器viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

5、实践案例——点云主曲率

示例效果:

示例代码:

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <Eigen/Dense>
#include <ctime>
#include <cstdlib>int main(int argc, char** argv)
{// 初始化随机数生成器std::srand(std::time(nullptr));// 创建点云对象并生成曲面点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());// 生成双曲抛物面 z = x^2 - y^2,并添加噪声float noise_level = 0.02f; // 噪声水平for (float x = -1.0; x <= 1.0; x += 0.05){for (float y = -1.0; y <= 1.0; y += 0.05){pcl::PointXYZ point;point.x = x + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;point.y = y + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;point.z = (x * x - y * y) + noise_level * static_cast<float>(rand()) / RAND_MAX - noise_level / 2.0f;cloud->points.push_back(point);}}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;// 计算点云的质心Eigen::Vector4f centroid;pcl::compute3DCentroid(*cloud, centroid);// 构建点云的协方差矩阵Eigen::Matrix3f covariance_matrix;pcl::computeCovarianceMatrixNormalized(*cloud, centroid, covariance_matrix);// 计算协方差矩阵的特征值和特征向量Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance_matrix, Eigen::ComputeEigenvectors);Eigen::Matrix3f eigen_vectors = eigen_solver.eigenvectors();Eigen::Vector3f eigen_values = eigen_solver.eigenvalues();// 主法向量是协方差矩阵的最小特征值对应的特征向量Eigen::Vector3f main_normal_vector = eigen_vectors.col(0);// 输出主法向量和主曲率std::cout << "主法向量: " << main_normal_vector.transpose() << std::endl;std::cout << "主曲率: " << eigen_values(0) << std::endl;// 可视化pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加点云到可视化器pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");// 可视化主法向量pcl::PointXYZ centroid_point(centroid[0], centroid[1], centroid[2]);pcl::PointXYZ normal_endpoint(centroid[0] + main_normal_vector[0],centroid[1] + main_normal_vector[1],centroid[2] + main_normal_vector[2]);viewer->addArrow(normal_endpoint, centroid_point, 1.0, 0.0, 0.0, false, "main_normal");// 运行可视化器viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

代码分析:

  • 生成曲面点云数据

    • 生成一个双曲抛物面(z = x^2 - y^2)的点云数据,并添加一定的噪声。
  • 法线估计

    • 使用 pcl::NormalEstimation 计算每个点的法线。
  • 主曲率估计

    • 使用 pcl::PrincipalCurvaturesEstimation 计算每个点的主曲率方向和大小。
    • 设置 setRadiusSearch 用于定义邻域的搜索半径。

输出信息:

主法向量:  0.105054 -0.104858  0.988923
主曲率: 0.175467

6、总结

1. 法向量 (Normal Vector)

法向量是一个垂直于曲面或平面的向量,描述了曲面在某一点的局部方向。

对于一个三维曲面,法向量是法平面的法线。法向量的计算通常涉及以下步骤:

  • 对于每个点,定义一个局部邻域。
  • 在这个邻域中,使用算法拟合一个平面。
  • 法向量是拟合平面的法线方向。

2. 主曲率 (Principal Curvatures)

主曲率描述了曲面在某一点沿不同方向的弯曲程度。

主曲率有两个:最大曲率和最小曲率,分别对应主曲率方向。

  • 最大曲率:曲面在某一点的最大弯曲程度。
  • 最小曲率:曲面在某一点的最小弯曲程度。

法向量提供了曲面在该点的法平面,主曲率方向则描述了在该法平面内的最大和最小弯曲方向。

分享完成~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用canvas 实现图片的标注,把标注像素点传入到后端

背景&#xff1a;我们有一个摄像的产品&#xff0c;拍照传统的水表盘面&#xff0c;我们需要框选水表读数&#xff0c;标注点传到后端&#xff0c;后端根据标注点自动去截取摄像表拍摄回来的图片&#xff0c;然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…

【时时三省】unity test 测试框架 使用 code blocks 移植

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;使用 Code::Blocks 17.12 创建工程 2&#xff0c;移植文件至该工程下&#xff1a; 移入的文件为: 被移入的文件介绍&#xff1a; 更改代码&#xff1a; 向工程添加文…

k8s 部署RuoYi-Vue-Plus之ingress域名解析

可参看https://blog.csdn.net/weimeibuqieryu/article/details/140798925 搭建ingress 1.创建Ingress对象 ingress-ruoyi.yaml其中host替换为你对应域名&#xff0c;需要解析域名到服务器, 同时为后端服务添加了二级域名解析 api. 访问http://xxx.xyz/就能访问前端&#xff0…

力扣SQL50 修复表中的名字 字符串函数

Problem: 1667. 修复表中的名字 &#x1f468;‍&#x1f3eb; 参考题解 select user_id, CONCAT(UPPER(left(name, 1)), LOWER(RIGHT(name, length(name) - 1))) as name from Users order by user_id

【Linux系统编程】:进程地址空间1

1.引出进程地址空间 因为str指向的是字符串首字母的地址&#xff0c;首字母是字符常量“h”&#xff0c;地址存储在字符常量区&#xff0c;无法修改&#xff0c;故报错。 Linux进程地址空间与进程内存布局详解 - 知乎 (zhihu.com) 我们编写一段代码&#xff0c;来认识一下存储…

JavaWeb学习——mybatis

目录 一、入门学习 1、什么是mybatis&#xff1f; 2、入门使用 3、配置SQL提示 4、数据库连接池 5、lombok 二、基础操作学习 1、删除 2、新增 3、更新 4、查询 三、XML配置文件 1、映射规范 2、示例代码展示 四、动态SQL 1、学习 2、学习 3、学习 4、学习 一…

Django文件上传

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介…

算法力扣刷题记录 六十三【回溯章节开篇】

前言 开始回溯章节学习。 在二叉树中预先体会了回溯。那么回溯单独来说是怎么回事&#xff1f; 一、基础知识学习 回溯基础知识参考链接 二、组合问题 2.1题目阅读 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答…

【C++入门(上)】—— 我与C++的不解之缘(一)

前言&#xff1a; 学完C语言和初阶数据结构&#xff0c;感觉自己又行了&#xff1f; 接下来进入C的学习&#xff0c;准备好接受头脑风暴吧。 一、第一个C程序 C 的第一个程序&#xff0c;梦回出学C语言&#xff0c;第一次使用C语言写代码&#xff1b;这里使用C写第一个C代码。 …

对优先级队列(堆)的理解

目录&#xff1a; 一. 优先级队列&#xff1a; 二. 优先级队列的模拟实现&#xff1a; 三.常用接口介绍: 一. 优先级队列&#xff1a; 1 概念&#xff1a; 队列是一种先进先出的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时…

Linux系统目录结构

Linux系统下一切皆文件 &#xff01;&#xff01;&#xff01; 系统启动必须: /boot : 存放启动Linux时所需的内核文件&#xff0c;包括压缩后的内核镜像文件(vmlinuz)、虚拟文件系统镜像文件(initrd.img)、启动引导grub的配置文件。/etc : 系统全局配置文件&#xff0c;会影…

从Excel高手到SQL大师-解锁数据分析的无限潜力 -10分钟读懂职场必备技能

目录 Excel 和 SQL&#xff1a;看似相似却大不相同的数据处理利器Excel vs SQL&#xff1a;表面相似&#xff0c;本质迥异Excel&#xff1a;直观但受限的电子表格SQL&#xff1a;强大而灵活的数据库查询语言 从 Excel 到 SQL&#xff1a;跨越鸿沟Excel 数据筛选SQL 数据筛选 结…

基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构&#xff0c;而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求&#xff0c;多年来&am…

论文阅读:Most Probable Densest Subgraphs

摘要 本文提出了一种在不确定图中发现最有可能稠密子图&#xff08;MPDS&#xff09;的新方法。不确定图中的每条边都有存在概率&#xff0c;使得计算稠密子图变得複杂。作者定义了稠密子图概率&#xff0c;并证明了计算该概率是#P难的。为了解决这个问题&#xff0c;设计了基…

数据科学 - 数据预处理 (数据清洗,结构化数据)

1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来&#xff0c;数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量&#xff0c;保证数据集的一致性&#xff1b;促进数据分析与挖掘&#xf…

【大数据开发语言Scala的入门教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪁Scala 🪡Scala是一种功能丰富且具有强大表达能力的静态类型…

【2024蓝桥杯/C++/B组/传送阵】

题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …

成为git砖家(8): 使用 git log 查询范围内的 commit

文章目录 1. 查询 git log 的文档2. 不带任何参数: git log 啥意思&#xff1f;3. git log 最主要功能是什么&#xff1f;4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …

ubuntu sudo命令不需要密码

sudo vim /etc/sudoers1、注释掉 %sudo ALL(ALL:ALL) AL 2、添加 用户名 ALL(ALL:ALL) NOPASSWD:ALL保存&#xff0c;退出即可

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…