【PCL】Segmentation 模块—— 欧几里得聚类提取(Euclidean Cluster Extraction)
1、简介
PCL 的 Euclidean Cluster Extraction(欧几里得聚类提取) 是一种基于欧几里得距离的点云聚类算法。它的目标是将点云数据分割成多个独立的簇(clusters),每个簇代表一个独立的物体或结构。该算法通过计算点与点之间的欧几里得距离,将距离小于给定阈值的点归为同一个簇。
1.1 欧几里得聚类提取的原理
-
基于距离的聚类:
- 算法通过计算点云中每个点与其邻近点之间的欧几里得距离来判断它们是否属于同一个簇。
- 如果两个点之间的距离小于设定的阈值(
ClusterTolerance
),则认为它们属于同一个簇。
-
使用 KdTree 加速搜索:
- 为了高效地查找每个点的邻近点,算法使用 KdTree 数据结构来组织点云数据。
- KdTree 是一种空间划分数据结构,可以快速找到某个点附近的点。
-
聚类条件:
- 每个簇需要满足一定的点数范围:
- 最小点数(
MinClusterSize
):少于该点数的簇会被丢弃。 - 最大点数(
MaxClusterSize
):超过该点数的簇会被分割或丢弃。
- 最小点数(
- 每个簇需要满足一定的点数范围:
1.2 PCL 中 EuclideanClusterExtraction 的关键参数
在 PCL 中,pcl::EuclideanClusterExtraction
类用于实现欧几里得聚类提取。以下是其关键参数:
-
setClusterTolerance
:- 设置聚类的距离阈值。
- 例如,
setClusterTolerance(0.02)
表示两点之间的距离小于 2cm 时,它们属于同一个簇。
-
setMinClusterSize
:- 设置每个簇的最小点数。
- 例如,
setMinClusterSize(100)
表示点数少于 100 的簇会被丢弃。
-
setMaxClusterSize
:- 设置每个簇的最大点数。
- 例如,
setMaxClusterSize(25000)
表示点数超过 25000 的簇会被分割或丢弃。
-
setSearchMethod
:- 设置用于搜索邻近点的数据结构,通常是 KdTree。
- 例如,
setSearchMethod(tree)
,其中tree
是一个 KdTree 对象。
-
setInputCloud
:- 设置输入的点云数据。
-
extract
:- 执行聚类提取,结果存储在
std::vector<pcl::PointIndices>
中,每个pcl::PointIndices
表示一个簇。
- 执行聚类提取,结果存储在
1.3 欧几里得聚类提取的步骤
-
构建 KdTree:
- 使用点云数据构建 KdTree,以便快速查找邻近点。
-
遍历点云:
- 遍历点云中的每个点,找到其邻近点。
- 如果邻近点与当前点的距离小于阈值,则将它们归为同一个簇。
-
递归扩展簇:
- 对于每个邻近点,继续查找其邻近点,直到没有新的点可以加入当前簇。
-
过滤簇:
- 根据设定的最小点数和最大点数,过滤掉不符合条件的簇。
-
输出结果:
- 将每个簇的点云索引存储在
std::vector<pcl::PointIndices>
中。
- 将每个簇的点云索引存储在
2、代码示例
2.1 cluster_extraction.cpp
这段代码适用于处理3D点云数据,特别是在场景中分割平面和物体的应用中,代码主要包括点云的读取、滤波、平面分割、聚类以及保存聚类结果等步骤:
#include <pcl/ModelCoefficients.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/search/kdtree.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>
#include <iomanip> // for setw, setfillint
main ()
{// 读取点云数据pcl::PCDReader reader;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>), cloud_f (new pcl::PointCloud<pcl::PointXYZ>);reader.read ("table_scene_lms400.pcd", *cloud);std::cout << "PointCloud before filtering has: " << cloud->size () << " data points." << std::endl; // 输出滤波前的点云数量// 创建滤波对象:使用1cm的叶子大小对数据集进行下采样pcl::VoxelGrid<pcl::PointXYZ> vg;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);vg.setInputCloud (cloud);vg.setLeafSize (0.01f, 0.01f, 0.01f);vg.filter (*cloud_filtered);std::cout << "PointCloud after filtering has: " << cloud_filtered->size () << " data points." << std::endl; // 输出滤波后的点云数量// 创建平面模型的分割对象并设置所有参数pcl::SACSegmentation<pcl::PointXYZ> seg;pcl::PointIndices::Ptr inliers (new pcl::PointIndices);pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane (new pcl::PointCloud<pcl::PointXYZ> ());pcl::PCDWriter writer;seg.setOptimizeCoefficients (true);seg.setModelType (pcl::SACMODEL_PLANE);seg.setMethodType (pcl::SAC_RANSAC);seg.setMaxIterations (100);seg.setDistanceThreshold (0.02);int nr_points = (int) cloud_filtered->size ();while (cloud_filtered->size () > 0.3 * nr_points){// 从剩余的点云中分割出最大的平面组件seg.setInputCloud (cloud_filtered);seg.segment (*inliers, *coefficients);if (inliers->indices.size () == 0){std::cout << "Could not estimate a planar model for the given dataset." << std::endl;break;}// 从输入点云中提取平面内点pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud (cloud_filtered);extract.setIndices (inliers);extract.setNegative (false);// 获取与平面表面相关的点extract.filter (*cloud_plane);std::cout << "PointCloud representing the planar component: " << cloud_plane->size () << " data points." << std::endl;// 移除平面内点,提取剩余点extract.setNegative (true);extract.filter (*cloud_f);*cloud_filtered = *cloud_f;}// 为提取方法创建KdTree对象pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);tree->setInputCloud (cloud_filtered);std::vector<pcl::PointIndices> cluster_indices;pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;ec.setClusterTolerance (0.02); // 2cmec.setMinClusterSize (100);ec.setMaxClusterSize (25000);ec.setSearchMethod (tree);ec.setInputCloud (cloud_filtered);ec.extract (cluster_indices);int j = 0;for (const auto& cluster : cluster_indices){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);for (const auto& idx : cluster.indices) {cloud_cluster->push_back((*cloud_filtered)[idx]);} // 将聚类中的点添加到新的点云中cloud_cluster->width = cloud_cluster->size ();cloud_cluster->height = 1;cloud_cluster->is_dense = true;std::cout << "PointCloud representing the Cluster: " << cloud_cluster->size () << " data points." << std::endl;std::stringstream ss;ss << std::setw(4) << std::setfill('0') << j;writer.write<pcl::PointXYZ> ("cloud_cluster_" + ss.str () + ".pcd", *cloud_cluster, false); // 保存聚类结果到PCD文件j++;}return (0);
}
2.2 主要步骤:
- 读取点云数据:从PCD文件中读取点云数据,并输出点云的数量。
- 滤波:使用VoxelGrid滤波器对点云进行下采样,减少点云的数量,同时保持点云的形状。
- 平面分割:使用RANSAC算法从点云中分割出最大的平面组件,并提取出平面内点。
- 移除平面内点:将平面内点从点云中移除,保留剩余的点云。
- 聚类:使用欧几里得聚类算法对剩余的点云进行聚类,将点云分割成多个簇。
- 保存聚类结果:将每个聚类结果保存为单独的PCD文件。
2.3 关键点:
- VoxelGrid滤波:通过设置叶子大小(
setLeafSize
)来控制下采样的精度。 - RANSAC平面分割:通过设置最大迭代次数(
setMaxIterations
)和距离阈值(setDistanceThreshold
)来控制平面分割的精度。 - 欧几里得聚类:通过设置聚类容差(
setClusterTolerance
)、最小聚类大小(setMinClusterSize
)和最大聚类大小(setMaxClusterSize
)来控制聚类的效果。
2.4 CMakeLists.txt
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(cluster_extraction)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable (${PROJECT_NAME} cluster_extraction.cpp)
target_link_libraries (${PROJECT_NAME} ${PCL_LIBRARIES})
3、运行结果
- 编译
mkdir build && cd build
cmake ..
make
- 运行
./cluster_extraction
./cluster_extraction
PointCloud before filtering has: 460400 data points.
PointCloud after filtering has: 41049 data points.
PointCloud representing the planar component: 20536 data points.
PointCloud representing the planar component: 12442 data points.
PointCloud representing the Cluster: 4857 data points.
PointCloud representing the Cluster: 1386 data points.
PointCloud representing the Cluster: 321 data points.
PointCloud representing the Cluster: 291 data points.
PointCloud representing the Cluster: 123 data points.
-
保存提取到的点云文件
-
点云源文件
table_scene_lms400.pcd
-
点云提取后
相关文章:
【PCL】Segmentation 模块—— 欧几里得聚类提取(Euclidean Cluster Extraction)
1、简介 PCL 的 Euclidean Cluster Extraction(欧几里得聚类提取) 是一种基于欧几里得距离的点云聚类算法。它的目标是将点云数据分割成多个独立的簇(clusters),每个簇代表一个独立的物体或结构。该算法通过计算点与点…...
CMake技术细节:解决未定义,提供参数
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
BUUCTF_Web(October 2019 Twice SQL injection)
October 2019 Twice SQL injection 知识点: 二次注入: 当用户提交的恶意数据被存入数据库后,应用程序再把它读取出来用于生成新的SQL语句时,如果没有相应的安全措施,是有可能发生SQL注入的,这种注入就叫…...
CentOS 下载软件时报Error: Failed to synchronize cache for repo ‘AppStream‘解决方法
下载软件时出现以下问题 直接把CentOS-AppStream.repo改个名字就行 cd /etc/yum.repos.d/ mv CentOS-AppStream.repo CentOS-AppStream.repo.bak就可以了 解决思路 把AI问遍,无人会,解决法 想要下载软件通通失败了,解决方法当然是问AI&am…...
LeetCode 2661. First Completely Painted Row or Column
🔗 https://leetcode.com/problems/first-completely-painted-row-or-column 题目 给一个 m*n 的二维数组,给一个 arr 的一纬数组元素由 [1, m * n] 组成遍历 arr,对二维数组中对应的元素进行染色返回执行到 arr 的第几个 index 的时候&…...
git的安装
目录 下载 安装 下载 前往官网下载安装包Git 点击dowmload选择适合自己的版本 安装 next 全选 是否修改库名,默认master 使用默认的 使用默认的 配置实验选项(新功能,可以不选) 不点 最后安装在d盘,programfile…...
C#性能优化技巧:利用Lazy<T>实现集合元素的延迟加载
一、C#中的Lazy C#中的Lazy<T>是一个泛型类,它实现了延迟加载(Lazy Initialization)的功能。延迟加载是指对象的创建被推迟,直到第一次被使用时才进行实例化。这对于大型或资源密集型对象的性能优化非常有用,因…...
Jenkins-基于Role的鉴权机制
jenkins自带了一些全局性的安全配置。 但无法通过job等相对细粒度的来控制使用者的权限。但它可以借助相关的插件实现细颗粒的权限控制。 插件: Role-based Authorization Strategy 需要在configure global security中配置授权策略如下: 保存后&#x…...
Python 并发编程的终极武器:使用 `multiprocessing` 模块征服计算密集型任务
Python 并发编程的终极武器:使用 multiprocessing 模块征服计算密集型任务 在Python中,由于全局解释器锁(GIL)的存在,多线程在处理CPU密集型任务时并不能真正实现并行,而是以交替执行的方式模拟并发,效率提升有限。为了充分利用多核CPU的优势,我们需要使用多进程。mul…...
vscode如何选用不同的python的解释器
在 VS Code 中设置 Python 的运行环境需要以下几个步骤,具体配置取决于你的开发环境和需求: 1. 安装必要工具 安装 Python: 确保已在系统中安装 Python(推荐通过 Python 官方网站 安装)。安装 VS Code 和 Python 扩展…...
MyBatis 注解开发详解
MyBatis 注解开发详解 MyBatis 支持使用注解来进行数据库操作。注解方式将 SQL 语句直接写在 Java 接口中,通过注解来完成 CRUD(增删改查)操作,省去了使用 XML 配置的繁琐步骤。这种方式适合简单项目或快速原型开发,因…...
【动态规划】--- 斐波那契数模型
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 🏠 第N个泰波那契数模型 📌 题目解析 第N个泰波那契数 题目要求的是泰波那契数,并非斐波那契数。 &…...
【EdgeAI实战】(1)STM32 边缘 AI 生态系统
【EdgeAI实战】(1)STM32 边缘 AI 生态系统 【EdgeAI实战】(1)STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…...
【陕西省乡镇界】面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测评
标题中的“陕西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip”表明这是一个地理信息系统(GIS)的数据集,专为陕西省的乡镇区域设计。该数据集以Shapefile(shp)格式提供,是GIS领…...
Fabric区块链网络搭建:保姆级图文详解
目录 前言1、项目环境部署1.1 基础开发环境1.2 网络部署 2、后台环境2.1、环境配置2.2、运行springboot项目 3、PC端3.1、安装依赖3.2、修改区块链网络连接地址3.3、启动项目 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加…...
HTML 表单和输入标签详解
HTML 表单是网页与用户交互的重要工具,它允许用户输入数据并将其提交到服务器。表单在网页中的应用非常广泛,例如登录、注册、搜索、评论等功能都离不开表单。本文将详细介绍 HTML 表单及其相关标签的使用方法,帮助你全面掌握表单的设计与实现…...
sql实战解析-sum()over(partition by xx order by xx)
该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 从简单开始一步一步讲, 1、sum( )over( ) 对所有行进行求和 2、sum(…...
Vue平台开发三——项目管理页面
前言 对于多个项目的使用,可能需要进行项目切换管理,所以这里创建一个项目管理页面,登录成功后跳转这个页面,进行选择项目,再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…...
JDBC实验测试
一、语言和环境 实现语言:Java。 环境要求:IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。 二、技术要求 该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。 三、功能要求 某电商公司为了方便客服查看用户的订单信…...
使用 vllm 部署 MiniCPM-o 2.6
使用 vllm 部署MiniCPM-o 2.6 1. 创建虚拟环境2. 克隆代码3. 从代码安装 vllm4. 安装 flash-attn5. 启动 MiniCPM-o 2.66. 使用 chatbox 客户端访问并测试一下 1. 创建虚拟环境 conda create -n vllm_openbmb python3.11 -y conda activate vllm_openbmb 2. 克隆代码 git clo…...
WSL 2 自动更新 虚拟 IP 到 window hosts
window下的wsl2 开发中使用到 域名映射,但是WSL2 每次启动都会被分配一个虚拟的 ip 地址,每次启动虚拟ip 都不一样,导致要频繁 更改 window 的 hosts 文件,太麻烦了,所以写一个自动执行的 .sh 脚本,每次启动…...
非常棒的长文本输入大模型:MiniMax以及基于它的海螺AI模型
非常棒的长文本输入大模型:基于MiniMax的海螺AI模型,快来体验一下吧! 海螺AI—MiniMax 旗下生产力产品,你的AI伙伴,10倍速提升工作学习效率 这个大模型最大的特点就是支持长文本输入,而且是从内部就擅长对长…...
python milvus及curl命令进行query请求
代码如下: from pymilvus import MilvusClient client = MilvusClient( uri="http://localhost:19530", token="root:Milvus" ) res = client.query( collection_name="query_collection", filter="color like \"…...
谈谈MySQL中的索引和事务
目录 1. 索引 1.1 索引介绍 1.2 缺陷 1.3 使用 1.3.1 查看索引 1.3.2 创建索引 1.3.3 删除索引 2. 索引底层的数据结构 2.1 B树 3. 事务 3.1 为什么使用事务 3.2 事务的使用 3.3 事务的基本特性 1. 索引 1.1 索引介绍 索引相当于一本书的目录(index), 在一…...
Java 资源管理教程:掌握 close 方法、Cleaner 类与 Runtime.addShutdownHook
在 Java 编程中,高效地管理资源是至关重要的,特别是当你处理文件、数据库连接、网络连接等有限资源时。为了确保这些资源得到正确释放,Java 提供了多种机制。本教程将深入探讨 close 方法、Cleaner类以及 Runtime.addShutdownHook 方法&#…...
tensorflow源码编译在C++环境使用
https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下载软件对应的版本,最好一模一样 1、下载TensorFlow源码 https://github.com/tensorflow/tensorflow 2、安装编译protobuf(3.9.2) protobuf版本要和TensorFlo…...
算法日记8:StarryCoding60(单调栈)
一、题目 二、解题思路: 题意为让我们找到每个元素的左边第一个比它小的元素,若不存在则输出-1 2.1法一:暴力(0n2) 首先,我们可以想到最朴素的算法:直接暴力两层for达成目标核心代码如下&…...
HarmonyOS快速入门
HarmonyOS快速入门 1、基本概念 UI框架: HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。 方…...
基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
stm32使用MDK5.35时遇到*** TOOLS.INI: TOOLCHAIN NOT INSTALLED
mdk5.35出现*** TOOLS.INI: TOOLCHAIN NOT INSTALLED的问题!!!! 以管理员身份重新打开MDK5.35.0.0,用keygen破解密码,但是一直提示我是没有破解成功。 解决办法: target 改成ARM...
Java面试专题——常见面试题1
引入 本文属于专题中的常见面试题模块,属于面试时经常遇到的,适合需要面试的小伙伴做面试前复习准备用,后续会持续补充 1.面向对象基本特征 面向对象的基本特征是什么?怎么理解? 面向对象的基本特征是封装、继承、…...
【C++】在线五子棋对战项目网页版
目录 1.Websocket 1.1.Websocket的简单认识 1.2.什么是轮询呢? 1.3.websocket协议切换过程 1.4.websocketpp库常用接口认识 1.5.websocketpp库搭建服务器流程 1.6.websocketpp库搭建服务器 2.mysqlclient库-接口认识 3.项目模块的划分: 4.项目…...
【Docker】搭建一个功能强大的自托管虚拟浏览器 - n.eko
前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版本为 DSM 7.2.2-72806 Update 2。 n.eko 支持多种类型浏览器在其虚拟环境中运行,本次教程使用 Chromium 浏览器镜像进行演示,支持访问内网设备和公网地址。 简介 n.eko 是…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)
本文验证基于请求头中传递token信息的认证方式,webapi项目的控制器类中新建如下函数,仅通过验证的客户端能调用,需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…...
Linux 内核自旋锁spinlock(一)
文章目录 前言一、自旋锁1.1 简介1.2 API1.2.1 spin_lock/spin_unlock1.2.2 spin_lock_irq/spin_unlock_irq1.2.3 spin_lock_irqsave/spin_unlock_irqstore1.2.4 spin_lock_bh/spin_unlock_bh1.2.5 补充 二、自选锁原理三、自旋锁在内核的使用3.1 struct file3.2 struct dentry…...
JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。
1.首先定义一个接口,接口中有两个方法,分别是将属性转换成英文描述和中文描述。 其实就是将数据库中记录的 0 1 ,转换成后面的描述 这边定义了中文转换为默认方法,是因为有些属性不需要进行中文转换,或者该属性的枚举…...
利用免费GIS工具箱实现高斯泼溅切片,将 PLY 格式转换为 3dtiles
在地理信息系统(GIS)和三维数据处理领域,不同数据格式有其独特应用场景与优势。PLY(Polygon File Format)格式常用于存储多边形网格数据,而 3DTiles 格式在 Web 端三维场景展示等方面表现出色。将 PLY 格式…...
Mysql视图(学习自用)
一、概念 二、创建视图 三、查询视图 四、修改视图 五、删除视图 六、视图检查选项 七、视图的更新 八、视图的作用...
企业内训|基于华为昇腾910B算力卡的大模型部署和调优-上海某央企智算中心
近日上海,TsingtaoAI为某央企智算中心交付华为昇腾910B算力卡的大模型部署和调优课程。课程深入讲解如何在昇腾NPU上高效地训练、调优和部署PyTorch与Transformer模型,并结合实际应用场景,探索如何优化和迁移模型至昇腾NPU平台。课程涵盖从模…...
linux下一些参数的说明
/proc/sys/net/corebpf_jit_enable 作用:用于控制是否启用BPF(Berkeley Packet Filter)的即时编译(JIT)功能。当启用该功能时,JIT编译器会将eBPF(extended Berkeley Packet Filter)…...
CKS认证 | Day1 K8s集群部署与安全配置
一、K8s安全运维概述 Kubernetes(K8s) 是一个广泛使用的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。随着 K8s 在生产环境中的普及,安全运维成为确保系统稳定性和数据安全的关键。 1.1 安全运维的重要性 万物互联&…...
新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL
文章目录 前言步骤 1: 安装 Anaconda步骤 2: 创建新的 Anaconda 环境步骤 3: 安装最新版本的 PyTorch步骤 4: 安装特定版本的 PyTorch步骤 5: 安装最新版本的 DGL步骤 6: 安装特定版本的 DGL步骤 7: Pycharm中使用虚拟环境解释器第一种情况:创建新项目第二种情况&am…...
什么是PCB的Mark点?如何进行设计Mark点?
一、什么是Mark点? PCB的Mark点,也被称为基准点或光学定位点,是在印刷电路板(Printed Circuit Board, PCB)上设置的一种特殊标记。 图1.1 PCB的Mark点 Mark点的主要作用是为表面贴装技术(Surface Mount…...
Spark SQL中的from_json函数详解
Spark SQL中的from_json函数详解 在Spark SQL中,from_json是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。这个函数在处理半结构化数据(如JSON日…...
Vue 引入及简单示例
Vue 渐进式JavaScript 框架 学习笔记 - Vue 引入及简单示例 目录 与jquery区别 Vue引入 两种方式引入 下载到本地 代码结构 简单示例 Style中引入vue.js 对vue语法进行解析 对三目运算符支持 设置变量(状态) 总结 与jquery区别 不需要手动操…...
JDK长期支持版本(LTS)
https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本(LTS):JDK 8、11、17、21:...
审计文件标识作为水印打印在pdf页面边角
目录 说明 说明 将审计文件的所需要贴的编码直接作为水印贴在页面四个角落,节省辨别时间 我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本,现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径,先检测该路…...
图片专栏——概念
欢迎来到图片世界,大家一起学习交流! 1. 像素(Pixel) 定义:像素是图像的最小单位,是“图像元素”的缩写。你可以把像素想象成拼图中的一个最小块,无数个像素组合在一起就形成了完整的图像。作用ÿ…...
江天科技主要产品销售单价下滑,应收账款、存货周转率大幅下降
《港湾商业观察》廖紫雯 日前,苏州江天包装科技股份有限公司(以下简称:江天科技)冲击北交所,保荐机构为国投证券。 江天科技主要从事标签印刷产品的研发、生产与销售,公司主要产品包括薄膜类和纸张类的不…...
HTB:Remote[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ftp尝试匿名…...