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

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)

0、滤波算法概述

        PCL点云库中的滤波算法是处理点云数据不可或缺的一部分,它们能够有效地去除噪声、提取特征或进行数据降维。例如,使用体素网格滤波(VoxelGrid)可以减少点云数据量,同时保留重要的形状特征。此外,统计滤波器(StatisticalOutlierRemoval)能够识别并移除离群点,这对于清理数据集中的异常值非常有用。在实际应用中,滤波器的选择和配置需要根据具体任务的需求来决定,比如在机器人导航中,可能需要使用半径滤波器(RadiusOutlierRemoval)来去除距离传感器过近或过远的点,以获得更准确的环境模型。通过这些滤波技术,可以显著提高点云数据的质量,为后续的处理和分析工作打下坚实的基础。在PCL点云滤波中,还有一种常见的滤波方法是条件滤波(ConditionalRemoval)。这种方法允许用户根据自定义的条件来移除点云中的某些点。比如,可以根据点的坐标范围、颜色范围或者法线方向等条件进行过滤,以提取出满足特定条件的点云子集。条件滤波的灵活性使得它适用于各种复杂的场景和需求。

        除了上述提到的滤波方法外,PCL点云库还提供了许多其他类型的滤波算法,如双边滤波(BilateralFilter)和高斯滤波(GaussianFilter)等。双边滤波能够在保留边缘特征的同时平滑点云数据,非常适合于去除噪声但又不希望破坏点云中的细节结构。而高斯滤波则是一种更为简单的平滑滤波方法,它通过计算每个点周围邻域内的点的加权平均来更新该点的位置,从而达到平滑的效果。

        在实际应用中,PCL点云滤波算法的选择通常需要综合考虑多个因素,包括滤波效果、计算效率以及具体的应用场景等。有时,为了获得更好的滤波效果,可能需要结合使用多种滤波方法。例如,可以先使用体素网格滤波进行数据下采样,然后再使用统计滤波器去除剩余的噪声点。这样的组合使用可以充分发挥各种滤波算法的优势,达到最佳的滤波效果。总之,PCL点云库中的滤波算法为我们提供了强大的工具来处理和分析点云数据。通过合理选择和使用这些滤波方法,我们可以有效地去除噪声、提取特征或进行数据降采样,为后续的点云处理和分析工作提供有力的支持。下面我们将从条件滤波和直通滤波开启PCL库中滤波算法之旅!

1、直通滤波算法(PassThrough  Filter)

1.1、算法原理

        PCL库中点云直通滤波算法是一种简单有效的点云数据处理方法,其核心思想是根据要滤波的字段(如,X轴,Y轴,Z轴)和设定阈值范围α∈(limitMin,limitMax),如x∈[0.1,0.5],通过这个阈值来决定哪些点是噪声点,哪些点是有效点。直观式子如下:

        在实际操作中,算法会遍历点云数据集中的每一个点,根据预设的阈值条件来判断该点是否保留。通常,这个条件可能与点的强度、距离、角度或其他特征有关。通过这种方式,可以有效地去除那些不符合条件的噪声点,从而得到更加平滑和准确的点云数据,为后续的处理和分析提供更加可靠的输入。

1.2、主要成员函数和变量 

        PCL库中的pcl:PassThrough类实现了比较灵活,完全取决于用户设置的限定字段和对应条件的直通滤波算法主要的成员变量和函数有如下:

        1、主要成员变量

        1)、用户所需要过滤字段名称

std::string filter_field_name_;

        2)、限制的最小过滤值 

double filter_limit_min_;

        3)、限制的最大过滤值

double filter_limit_max_;

        2、主要成员函数

        1)、设置限定字段的名称字符串field_name,例如"X"

void setFilterFieldName(const std::string &field_ name)

        2)、设置滤波限制条件, 最小值limit_ min和最大值limit_max 

void setFilterLimits(const double &limit_min,const double &limit_max)

        3)、设置返回滤波结果是限制条件外点还是内部点,limit_negative默认值为false,输出点云为在设定字段的设定范围内的点集,如果设置为true则刚好相反

inline void setFilterLimitsNegative (const bool limit_negative)

1.3、主要部分代码注解

template <typename PointT> void
pcl::PassThrough<PointT>::applyFilterIndices (std::vector<int> &indices)
{// The arrays to be usedindices.resize (indices_->size ());removed_indices_->resize (indices_->size ());int oii = 0, rii = 0;  // oii = 输出索引, rii = 移除索引// 如果未指定滤波的字段,则仅仅是移除点云数据无效点if (filter_field_name_.empty ()){// 仅仅是移除点云数据无效点for (const auto ii : *indices_)  // ii = input index{// // 滤掉无效点if (!std::isfinite (input_->points[ii].x) ||!std::isfinite (input_->points[ii].y) ||!std::isfinite (input_->points[ii].z)){if (extract_removed_indices_)(*removed_indices_)[rii++] = ii;continue;}indices[oii++] = ii;}}else{// 获取字段名称的索引,如字段“z",返回索引为:std::vector<pcl::PCLPointField> fields;int distance_idx = pcl::getFieldIndex<PointT> (filter_field_name_, fields);if (distance_idx == -1){PCL_WARN ("[pcl::%s::applyFilter] Unable to find field name in point type.\n", getClassName ().c_str ());indices.clear ();removed_indices_->clear ();return;}// 滤波算法主体,滤掉无效点和指定的字段限制值for (const auto ii : *indices_)  // ii = input index{// 滤掉无效点if (!std::isfinite (input_->points[ii].x) ||!std::isfinite (input_->points[ii].y) ||!std::isfinite (input_->points[ii].z)){if (extract_removed_indices_)(*removed_indices_)[rii++] = ii;//保留移除点的索引continue;}// 获取指定字段的值,如x=0.3const std::uint8_t* pt_data = reinterpret_cast<const std::uint8_t*> (&input_->points[ii]);float field_value = 0;memcpy (&field_value, pt_data + fields[distance_idx].offset, sizeof (float));// 判断获取指定字段的值是否为无效点,如果是则移除掉if (!std::isfinite (field_value)){if (extract_removed_indices_)(*removed_indices_)[rii++] = ii;continue;}//negative_ 为false, 在字段限制值之外将会被移除,if (!negative_ && (field_value < filter_limit_min_ || field_value > filter_limit_max_)){if (extract_removed_indices_)(*removed_indices_)[rii++] = ii;continue;}// negative_ 为true,在字段限制值之外将会保留if (negative_ && field_value >= filter_limit_min_ && field_value <= filter_limit_max_){if (extract_removed_indices_)(*removed_indices_)[rii++] = ii;continue;}// 保留输出内点的索引indices[oii++] = ii;}}// Resize the output arraysindices.resize (oii);removed_indices_->resize (rii);
}

1.4、算法使用示例

/*****************************************************************//**
* \file   PCLPassthroughmain.cpp
* \brief  
*
* \author YZS
* \date   December 2024
*********************************************************************/
#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/filters/passthrough.h>
#include <pcl/filters/conditional_removal.h>
void Passthrough()
{// 随机种子初始化srand(time(NULL));pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 生成点云数据3000个cloud->width = 1000;cloud->height = 1;cloud->points.resize(cloud->width * cloud->height);for (size_t i = 0; i < cloud->points.size(); ++i) {cloud->points[i].x = 10.0f * rand() / (RAND_MAX + 1.0f);cloud->points[i].y = 10.0f * rand() / (RAND_MAX + 1.0f);cloud->points[i].z = 10.0f * rand() / (RAND_MAX + 1.0f);}//保存滤波的结果pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFilter(new  pcl::PointCloud<pcl::PointXYZ>);// 创建PassThrough滤波器对象pcl::PassThrough<pcl::PointXYZ> pass;//滤波器对象pass.setInputCloud(cloud);                 //设置需要滤波的点云pass.setFilterFieldName("y");              //设置需要滤波的字段pass.setFilterLimits(0.0, 5.0);            //设置限定范围//pass.setFilterLimitsNegative (true);//是否反向过滤,默认为falsepass.filter(*cloudFilter);          //执行滤波//结果可视化// PCLVisualizer对象pcl::visualization::PCLVisualizer viewer("FilterVIS");//创建左右窗口的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);//设置cloud1的渲染颜色,点云的ID和指定可视化窗口v1pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>   cloud1_color(cloud, 255, 255, 255);viewer.addPointCloud(cloud, cloud1_color, "cloud1", v1);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,  3, "cloud1");//设置cloud2的渲染颜色,点云的ID和指定可视化窗口v2pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>   cloud2_color(cloud, 250, 255, 255);viewer.addPointCloud(cloudFilter, cloud2_color, "cloud2", v2);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,  3, "cloud2");// 可视化循环主体while (!viewer.wasStopped()){viewer.spinOnce();}
}
int main(int argc, char* argv[])
{Passthrough();std::cout << "Hello World!" << std::endl;std::system("pause");return 0;
}

        结果:

2、条件滤波算法(ConditionalRemoval Filter )

2.1、算法原理

        点云滤波条件滤波算法原理基于设定的条件来筛选点云数据。与直通滤波算法不同,条件滤波算法不限于单一的轴向阈值,而是可以基于点云的多种属性,如强度、颜色、法线方向等,来定义更为复杂的滤波规则。例如,可以设置一个强度阈值,仅保留强度在一定范围内的点,或者根据点的法线方向来过滤数据,只保留那些法线方向符合特定条件的点。因此,条件滤波允许用户定义一个或多个条件表达式,这些表达式会应用于点云数据集中的每一个点。算法会根据这些条件表达式来决定是否保留某个点。由于条件可以非常灵活,因此这种算法能够适应各种不同的应用场景和需求。在实际应用中,条件滤波算法可以实现更为精细的数据处理。例如,在自动驾驶车辆的激光雷达数据处理中,可以使用条件滤波来去除地面反射的点,保留车辆和障碍物的点云数据。这样的处理对于后续的物体检测和分类至关重要。

2.2、主要成员函数和变量

        PCL库中的pcl:ConditionalRemoval类中提供了多种条件比较,如FieldComparison类(字段比较)、PackedRGBComparison类(RGB颜色比较)、PackedHSIComparison类(HSI色彩比较)和TfQuadraticXYZComparison类(二次项比较)等条件类型,这些条件类型最终通过ConditionOr类和ConditionAnd类来控制调用,用户可以根据自己的需求来设置滤波条件。滤波算法中主要的成员变量有如下:

        1、主要成员变量

        1)、是否要保持点云数据的原始结构,true,保持原始结构,被滤波的点用NAN替代,false不保存原始结果。

bool keep_organized_;

        2)、滤波比较条件

 ConditionBasePtr condition_;

        滤波条件类

        class ConditionAnd  当所有比较条件值都为真时,ConditionAnd的值为真

        class ConditionOr   当任何比较条件的值为真时,ConditionOr的值为真

        3)、用户设置的过滤限定值

float user_filter_value_;

          2、主要成员函数

            1)、设置是否要保持点云数据的原始结构

inline void setKeepOrganized (bool val);

            2)、设置用户提供的过滤限定值 

inline void setUserFilterValue (float val);

           3)、设置过滤器所用条件。每个参数条件都必须满足,以确保数据点不会因不满足条件而被过滤器排除。

void setCondition (ConditionBasePtr condition);

         比较操作的类型如下:

enum CompareOp{GT, GE, LT, LE, EQ};

        具体含义如下: 

EQ EQUAL等于GT GREATER THAN大于 LT LESS THAN小于GE GREATER THAN OR EQUAL 大于等于LE LESS THAN OR EQUAL 小于等于

 2.3、主要部分代码注解

template <typename PointT> void
pcl::ConditionalRemoval<PointT>::applyFilter (PointCloud &output)
{........// 将输入的头文件赋值给输出文件output.header       = input_->header;if (!keep_organized_){//不保存原来数据结构      output.height    = 1;   output.is_dense  = true;}else{//保存原来数据结构      output.height   = this->input_->height;output.width    = this->input_->width;output.is_dense = this->input_->is_dense;}output.points.resize (input_->points.size ());removed_indices_->resize (input_->points.size ());int nr_p = 0;int nr_removed_p = 0;//不保存原来数据结构实现if (!keep_organized_){for (std::size_t index: (*Filter<PointT>::indices_)){const PointT& point = input_->points[index];// 无效点判断if (!std::isfinite (point.x)|| !std::isfinite (point.y)|| !std::isfinite (point.z)){if (extract_removed_indices_){(*removed_indices_)[nr_removed_p] = index;nr_removed_p++;}continue;}//条件判断实现接口,if (condition_->evaluate (point)){//将满足条件的数据拷贝到输出点云中copyPoint (point, output.points[nr_p]);nr_p++;}else{//保存移除点云的索引if (extract_removed_indices_){(*removed_indices_)[nr_removed_p] = index;nr_removed_p++;}}}output.width = nr_p;output.points.resize (nr_p);}else  //不保存原来数据结构实现{//获取输入点云数据的索引集合std::vector<int> indices = *Filter<PointT>::indices_;std::sort (indices.begin (), indices.end ()); //对索引集排序bool removed_p = false;std::size_t ci = 0;for (std::size_t cp = 0; cp < input_->points.size (); ++cp){//对索引集合内的点进行条件比较if (cp == static_cast<std::size_t> (indices[ci])){if (ci < indices.size () - 1){ci++;if (cp == static_cast<std::size_t> (indices[ci]))   continue;}copyPoint (input_->points[cp], output.points[cp]);//条件判断实现接口,if (!condition_->evaluate (input_->points[cp])){//满足点的值设置为用户设定的值output.points[cp].getVector4fMap ().setConstant (user_filter_value_);removed_p = true;if (extract_removed_indices_){(*removed_indices_)[nr_removed_p] = static_cast<int> (cp);nr_removed_p++;}}}else{//将非索引集合以外的点的值设置为用户设定的值output.points[cp].getVector4fMap ().setConstant (user_filter_value_);removed_p = true;}}if (removed_p && !std::isfinite (user_filter_value_))output.is_dense = false;}........
}      

2.4、算法使用示例

/*****************************************************************//**
* \file   ConditionalRemovalmain.cpp
* \brief
*
* \author YZS
* \date   December 2024
*********************************************************************/
#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/filters/passthrough.h>
#include <pcl/filters/conditional_removal.h>using namespace std;void ConditionalRemoval()
{pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new  pcl::PointCloud<pcl::PointXYZRGB>());std::string fileName = "E:/PCLlearnData/9/fragment.pcd";pcl::io::load(fileName, *cloud);std::cout << "Cloud Size:" << cloud->points.size() << std::endl;// 创建过滤条件pcl::ConditionAnd<pcl::PointXYZRGB>::Ptr range_cond(new  pcl::ConditionAnd<pcl::PointXYZRGB>());// x值 大于-0.05range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr \(new pcl::FieldComparison<pcl::PointXYZRGB>("x", pcl::ComparisonOps::GT, -1.3)));// x值 小于-1.3range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr \(new pcl::FieldComparison<pcl::PointXYZRGB>("x", pcl::ComparisonOps::LT, -0.05)));//保存滤波后的结果pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFilter(new  pcl::PointCloud<pcl::PointXYZRGB>());pcl::ConditionalRemoval<pcl::PointXYZRGB> conFilter;// 条件滤波器类对象conFilter.setCondition(range_cond); // 设置滤波条件conFilter.setInputCloud(cloud);conFilter.setKeepOrganized(false);// 设置是否保持有序,若输入为有序点云,可以设置为trueconFilter.filter(*cloudFilter); // 执行滤波,并且保存结果到cloudFilter中std::cout << "filter Cloud Size:" << cloudFilter->points.size() << std::endl;//结果可视化
// PCLVisualizer对象pcl::visualization::PCLVisualizer viewer("FilterVIS");//创建左右窗口的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, 3, "cloud1");//设置cloud2的渲染属性,点云的ID和指定可视化窗口v2viewer.addPointCloud(cloudFilter, "cloud2", v2);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud2");// 可视化循环主体while (!viewer.wasStopped()){viewer.spinOnce();}
}
int main(int argc, char* argv[])
{ConditionalRemoval();std::cout << "Hello World!" << std::endl;std::system("pause");return 0;
}

        结果:

        至此完成第九节PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)学习,下一节我们将进入《PCL库中点云滤波之体素滤波(VoxelGrid)》的学习。 

相关文章:

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)

0、滤波算法概述 PCL点云库中的滤波算法是处理点云数据不可或缺的一部分&#xff0c;它们能够有效地去除噪声、提取特征或进行数据降维。例如&#xff0c;使用体素网格滤波&#xff08;VoxelGrid&#xff09;可以减少点云数据量&#xff0c;同时保留重要的形状特征。此外&#…...

v语言介绍

V 语言是一种多用途的编程语言&#xff0c;可以用于前端开发、后端开发、系统编程、游戏开发等多个领域。它的设计哲学是提供接近 C 语言的性能&#xff0c;同时简化开发过程并提高代码的安全性和可读性。接下来我会详细介绍 V 在前后端开发中的应用&#xff0c;并给出一个具体…...

GPT-O3:简单介绍

GPT-O3&#xff1a;人工智能领域的重大突破 近日&#xff0c;OpenAI发布了其最新的AI模型GPT-O3&#xff0c;这一模型在AGI评估中取得了惊人的成绩&#xff0c;展现出强大的能力和潜力。GPT-O3的出现标志着人工智能领域的重大进步&#xff0c;预计将在2025年实现更大的突破。 …...

重温设计模式--适配器模式

文章目录 适配器模式&#xff08;Adapter Pattern&#xff09;概述适配器模式UML图适配器模式的结构目标接口&#xff08;Target&#xff09;&#xff1a;适配器&#xff08;Adapter&#xff09;&#xff1a;被适配者&#xff08;Adaptee&#xff09;&#xff1a; 作用&#xf…...

API部署大模型

由于生产测试环境的服务器配置较低 不能够支撑大模型运行的配置 所以需要将大模型封装部署在A服务器上 在B服务器上进行调用 封装时可以使用FastAPI与Websocket两种通信方式进行通信 Websocket 在A服务器端部署大模型&#xff08;服务端&#xff09; import asyncio import …...

Linux -- 同步与条件变量

目录 同步 条件变量 pthread_cond_t pthread_cond_init&#xff08;初始化条件变量&#xff09; pthread_cond_destroy&#xff08;销毁条件变量&#xff09; pthread_cond_wait&#xff08;线程等待条件变量&#xff09; 重要提醒 pthread_cond_boardcast&#xff08…...

Linux之ARM(MX6U)裸机篇----1.开发环境搭建

下载开启FTP服务 作用&#xff1a;用于电脑与linux系统之前文件传输 如上&#xff0c;编辑完成后重启 Window下FTP客户端安装使用http://www.filezilla.cn/download网址下载 新建网络连接站点 主机后写虚拟机的ip地址&#xff0c;用ifconfig查出ipv4的地址 笔记本电脑中虚拟…...

【C语言】结构体模块化编程

在模块化编程中&#xff0c;结构体作为数据存储的主要方式之一&#xff0c;它不仅用于存储数据&#xff0c;还帮助实现代码的封装与隐私保护。通过将结构体定义放在 .c 文件中并使用 get_ 和 set_ 函数进行访问&#xff0c;我们可以实现对结构体数据的保护&#xff0c;同时降低…...

SpringCloudAlibaba技术栈-Nacos

1、什么是Nacos&#xff1f; Nacos是个服务中心&#xff0c;就是你项目每个功能模块都会有个名字&#xff0c;比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中&#xff0c;其他模块也是这样的。好处是这样能更好地管理项…...

Windows11家庭版启动Hyper-V

Hyper-V 是微软的硬件虚拟化产品&#xff0c;允许在 Windows 上以虚拟机形式运行多个操作系统。每个虚拟机都在虚拟硬件上运行&#xff0c;可以创建虚拟硬盘驱动器、虚拟交换机等虚拟设备。使用虚拟化可以运行需要较旧版本的 Windows 或非 Windows 操作系统的软件&#xff0c;以…...

《信管通低代码信息管理系统开发平台》Linux环境安装说明

1 简介 信管通低代码信息管理系统应用平台提供多环境软件产品开发服务&#xff0c;包括单机、局域网和互联网。我们专注于适用国产硬件和操作系统应用软件开发应用。为事业单位和企业提供行业软件定制开发&#xff0c;满足其独特需求。无论是简单的应用还是复杂的系统&#xff…...

第一节:电路连接【51单片机-L298N-步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模块 ⑤二相四线步进电机 ⑥电线若干 二、接线 三、L298N模…...

YoloDotNet 识别图像中特定关键点的位置

文章目录 1、初始化 Yolo 对象2、加载图像与检测关键点3、处理检测结果4、自定义关键点绘制和处理5、注意事项1、初始化 Yolo 对象 设置 YoloOptions,包括模型路径、模型类型(如果有专门的关键点检测模型类型则指定)、GPU 使用相关参数等。例如: var yoloOptions = new Yo…...

山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)

1、设计目的 山景提供的SDK是蓝牙音箱demo&#xff0c;用户使用ADC按键或者IR遥控器&#xff0c;进行人机交互。然而现实很多场景&#xff0c;需要和单片机通信&#xff0c;不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示…...

Leetcode3218. 切蛋糕的最小总开销 I

题目描述&#xff1a; 有一个 m x n 大小的矩形蛋糕&#xff0c;需要切成 1 x 1 的小块。 给你整数 m &#xff0c;n 和两个数组&#xff1a; horizontalCut 的大小为 m - 1 &#xff0c;其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。verticalCut 的大小为 n - 1 …...

基于自然语言处理(NLP)的智能客服系统

基于自然语言处理&#xff08;NLP&#xff09;的智能客服系统是现代客户服务领域的一项重要技术&#xff0c;它通过模拟人类对话的方式&#xff0c;为用户提供及时、准确和个性化的服务。以下是关于基于NLP的智能客服系统的一些关键要素和功能&#xff1a; 1. 自然语言理解&am…...

RAG实战:构建基于本地大模型的智能问答系统

RAG实战&#xff1a;构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代&#xff0c;如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;结合本地大模型&#xff0c;构建一个高效的智…...

三维扫描在汽车/航空行业应用

三维扫描技术应用范围广泛&#xff0c;从小型精密零件到大型工业设备&#xff0c;都能实现快速、准确的测量。 通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维…...

基于AI IDE 打造快速化的游戏LUA脚本的生成系统

前面写了一篇关于使用AI IDE进行C安全开发的博客《使用AI IDE 助力 C 高性能安全开发&#xff01;》&#xff0c; 得到许多同学们的喜欢&#xff0c;今天我们来继续在游戏开发中扩展一下AI的能力&#xff0c;看看能不能给游戏研发团队一些启发。 在游戏研发中&#xff0c;Lua曾…...

http的访问过程或者访问页面会发生什么

1. 建立连接 客户端与服务器之间需要建立 TCP 连接&#xff0c;常用步骤如下&#xff1a; DNS解析&#xff1a;客户端将目标 URL 转换为服务器的 IP 地址。三次握手&#xff1a;TCP 协议通过三次握手建立可靠连接&#xff0c;确保双方具备通信能力。传输层连接建立&#xff1…...

Lua 函数

Lua 函数 1. 概述 Lua是一种轻量级的编程语言&#xff0c;常用于游戏开发、脚本编写和嵌入式系统。在Lua中&#xff0c;函数是一等公民&#xff0c;意味着它们可以作为变量传递&#xff0c;也可以作为参数传递给其他函数。本文将详细介绍Lua中的函数&#xff0c;包括函数的定…...

产品升级!Science子刊同款ARGs-HOST分析,get!

凌恩生物明星chanpin 抗性宏基因-宿主分析 Science子刊同款分析 数据挖掘更进一步&#xff01; 抗生素的大量使用与滥用使微生物体内编码抗生素抗性的基因在环境中选择性富集&#xff0c;致病菌通过基因突变或者水平基因转移获得抗生素抗性基因后&#xff0c;导致抗生素治疗…...

Kubernetes PV及PVC的使用

前提条件 拥有Kubernetes集群环境&#xff0c;可参考&#xff1a;Kubernetes集群搭建理解Kubernetes部署知识&#xff0c;可参考&#xff1a;使用Kubernetes部署第一个应用 、Deloyment控制器拥有NFS服务&#xff0c;可参考&#xff1a;Linux环境搭建NFS服务 概述 Persistent…...

struct udp_sock

这个struct udp_sock结构体是Linux内核网络栈中用于表示一个UDP套接字的数据结构。它继承自struct inet_sock,这意味着它包含了所有IPv4或IPv6套接字共享的基础信息和函数指针。下面是对struct udp_sock中一些关键成员的解释: struct inet_sock inet;:这是udp_sock结构体的第…...

《机器学习》数据预处理简介

目录 1. 数据清洗&#xff08;Data Cleaning&#xff09; &#xff08;1&#xff09;处理缺失值 &#xff08;2&#xff09;处理异常值 &#xff08;3&#xff09;处理重复数据 2. 数据转换&#xff08;Data Transformation&#xff09; &#xff08;1&#xff09;特征缩…...

USB接口实现CDC(usb转串口功能)

主控&#xff1a;stm32f429 PHY芯片&#xff1a;usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置&#xff1a;根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…...

ubuntu 网络管理--NetworkManager

ubuntu 网络管理--NetworkManager 1 介绍2 NetworkManager 命令2 nmcli 命令显示可用的wifi AP连接wifi检查网络连接 ?? 如何删除删除网络连接查看设备状态添加一个新的以太网连接设置静态 IP 地址启用并测试连接添加新的wifi连接 3 其他命令参考 1 介绍 NetworkManager 是标…...

FLV视频封装格式详解

目录(?)[-] OverviewFile Structure The FLV headerThe FLV File BodyFLV Tag Definition FLVTAGAudio TagsVideo TagsSCRIPTDATA onMetaDatakeyframes Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure…...

每天五分钟机器学习:核函数

本文重点 在学习支持向量机算法之前,我们要继续学习一些数学基础,本文我们将学习核函数的概念。当数据线性不可分的时候,此时就需要核函数出场了,它可以将低维不可分的数据映射到高维可分数据,此时就可以完成数据分类了。 核函数的定义 核函数K(x, y)定义为两个数据点x…...

Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用

Flutter开发HarmonyOS的好处&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...

4-pandas常用操作

前言 一、DataFrame修改index、columns 1.获取index df2 pd.DataFrame(np.arange(9).reshape(3,3),index[sh,cs,bj],columns[a,b,c]) df2.index 2.修改index df2.index [shanghai,changsha,beijing] df2.columns [A,B,C] # 注意赋值的顺序 3.批量修改&#xff…...

Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...

【0376】Postgres内核 分配 last safe MultiXactId

上一篇: 【0375】Postgres内核 XLOG 之 设置下一个待分配 MultiXactId 和 offset 文章目录 1. 最后一个安全的 MultiXactId1.1 计算 multi wrap limit1.2 计算 multi stop limit1.3 计算 multi warn limit1.4 计算 multi vacuum limit2. 初始化 MultiXactState 成员3. 完成 mu…...

大模型时代的NL2SQL初探

大模型时代的NL2SQL初探 NL2SQL的基本概念NL2SQL的实现逻辑现代NL2SQL框架与技术大语言模型&#xff08;LLM&#xff09;在NL2SQL中的应用向量数据库的作用NL2SQL的应用场景未来展望 在当今信息化时代&#xff0c;数据库已成为各行各业的数据存储核心。然而&#xff0c;直接使用…...

Linux环境下使用tomcat+nginx部署若依项目

Linux Tomcat MySQL Java 是构建动态网站系统的完美解决方案之一&#xff0c;具有免费、高 效、扩展性强且资源消耗低等优良特性。 Java Web 凭借其优秀的开发框架和良好的生态被广 泛应用于社会各行业的信息化系统构建。 本实验以若依管理系统&#xff08; http://ruo…...

京准电钟解读,NTP网络授时服务器如何提升DCS系统效率

京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考&#xff0c;可为它支持数万台支持标准的网…...

06 - Django 视图view

HttpRequest 和 HttpResponse Django中的视图主要用来接受Web请求&#xff0c;并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...

MySQL数据库(锁)

1、MySQL有哪些锁&#xff1f; 全局锁&#xff1a;flush tables with read lock 执行以下语句之后&#xff0c;使用全局锁&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行对数据的增删改或者对表结构的更改操作操作&#xff0c;都会被阻塞。 全局锁的应…...

Mac Android studio 升级LadyBug 版本,所产生的bug

当Build 出现&#xff0c;这样的文字以后&#xff1a; Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …...

springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目

springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&am…...

基于Java+Jsp Servlet Mysql实现的Java Web在线商城项目系统设计与实现

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的飞速发展&#xff0c;电子商务已成为现代商业活动的重要组成部分。在线商城作为电子商务的一种重要形式&#xff0c;以其便捷性、高效性和广泛覆盖性&#xff0c;受到了越来越多消费者的青睐。同时&#xff0c;随着消…...

安装K8s集群

文章首发于我的博客 &#xff1a;https://blog.liuzijian.com/post/9aa6d426-a01c-05b0-6f7a-5da4343f0f9e.html 因阿里云加速服务调整&#xff0c;镜像加速服务自2024年7月起不再支持&#xff0c;拉取镜像&#xff0c;下载网络插件等操作&#xff0c;需要科学上网访问DockerHu…...

【数据科学导论】第一二章·大数据与数据表示与存储

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据处理与分析_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言…...

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计&#xff0c;通过优化硬件组成和软件设计&#xff0c;实现高效率和高准确度的检定工作&#xff0c;有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…...

按行分割文本函数(C++)

文本分割函数SplitText2Line解析 以下是对SplitText2Line函数的详细介绍&#xff1a; void SplitText2Line(s8* strText, std::vector<std::string>& vecStrLines) {// 1. 清空存储结果的向量vecStrLines.clear();// 2. 打印原始文本信息&#xff08;用于调试目的&…...

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …...

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…...

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具&#xff0c;相比敲编程代码&#xff0c;用这个去做自定义数据对大多数人&#xff0c;应该是比较友好的。自定义数据分为外部序列数据&#xff0c;看了一下内容理解起来比较多&#xff0c;分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…...

阿里云镜像服务使用指南

阿里云容器镜像服务ACR&#xff08;Alibaba Cloud Container Registry&#xff09;是面向容器镜像、Helm Chart等符合OCI标准云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力&#xff0c;与容器服务A…...

adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);

下载老版本Platformtools​​​​​​​​​​​​​​https://dl.google.com/android/repository/platform-tools_r28.0.2-windows.zip?hlzh-cn 替换原来的platform-tools文件夹即可。 问题原因分析&#xff1a;电脑端adb client版本&#xff08;41&#xff09;和安卓端adb …...