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

news2024/9/23 3:20:42

前言

在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.0
    float 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.coloradmin.cn/o/1972109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么 Kubernetes 是现代开发的必备工具

引言 在现代软件开发中&#xff0c;容器已经成为打包和运行应用程序的标准方式。然而&#xff0c;在生产环境中&#xff0c;管理这些运行中的容器并确保服务的高可用性和稳定性并不是一件容易的事。比如&#xff0c;当一个容器发生故障时&#xff0c;需要快速启动另一个容器来代…

C++ std::atomic和std::mutex

C11 引入了两个重要的同步机制用于多线程编程&#xff1a;std::atomic 和 std::mutex。它们各自适用于不同的并发控制需求&#xff0c;并在实现和使用上有很大的不同。 1. 目的和用途 std::atomic: 设计目的&#xff1a;为原子操作提供支持&#xff0c;保证对变量的操作&#…

Python试讲

Python试讲 导语Python简介Python及其特点如何使用Python Python与计算计算变量 导语 本次试讲内容如下&#xff1a;Python简介与使用&#xff0c;Python与基本运算 辅助教材为 《趣学Python编程》和《Python编程从入门到实践》 Python简介 Python是目前入门最简单最好学的…

FVM安装及配置

一、下载fvm 包 git&#xff1a;Release fvm 3.1.7 leoafarias/fvm GitHub 解压到本地文件夹&#xff0c;然后添加环境变量 管理员模式打开cmd&#xff0c;查看是否成功 fvm --version 二、安装Dart SDK 下载Dart SDK&#xff1a;Dart for Windows 三、安装GIT 四、指定…

python3.10安装geopandans实战笔记

1.geopandans安装所需软件库版本 python3.10 GDAL-3.4.3-cp310-cp310-win_amd64.whl【手动下载】 Fiona-1.8.21-cp310-cp310-win_amd64.whl【手动下载】 shapely-2.0.2-cp310-cp310-win_amd64.whl【手动下载】 pyproj 手动下载地址&#xff1a;https://download.csdn.net/down…

range和enumerate的区别

range通过索引遍历元素&#xff0c;属于间接访问。 enumerate直接遍历元素&#xff0c;效率稍高&#xff0c;代码简洁。range输出的是元素的索引。 enumerate输出的是元素的索引和元素。 参考&#xff1a;range与enumerate的区别_enumerate和range-CSDN博客

(一)springboot2.7.6集成activit5.23.0之集成引擎

集成引擎很简单。 首先是创建springboot项目然后引入相关依赖就完成了。pom.xml如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.…

鸿蒙应用框架开发【媒体库视频】 UI框架

媒体库视频 介绍 本示例使用Video组件展示了视频组件的基本功能&#xff0c;包括视频组件化&#xff0c;全屏化&#xff0c;窗口化&#xff0c;上下轮播视频等。 效果预览 使用说明&#xff1a; 进入首页点击播放按键&#xff1b;点击视频播放按钮&#xff0c;视频开始播放…

CTFHub技能树web——XSS——DOM反射

根据框里的内容 直接右键查看网页源代码 看到 了其闭合方式 然后去网页测试一下alert&#xff08;1&#xff09;反射 ;</script><script>alert(1)</script> 看到 确实存在 去xssaq.cn 创建一个项目 把src粘过来 在第一个输入框中 再将返回回来的url 复…

NAND行业回归盈利:AI与云存储需求驱动

市场概览 根据Yole Group于2024年6月25日发布的市场报告&#xff0c;经过五个季度的亏损之后&#xff0c;NAND闪存行业在2024年第一季度&#xff08;1Q24&#xff09;实现了盈利回归。这一转变主要得益于企业级固态硬盘&#xff08;SSD&#xff09;领域的强劲需求增长&#xf…

【教程】Python语言的地球科学常见数据——海温数据-NOAA OISST 的处理

NOAA 1/4每日最佳内插海面温度&#xff08;OISST&#xff09;是一个长期的气候数据记录&#xff0c;它将来自 不同平台&#xff08;卫星、船舶、浮标和 Argo 浮标&#xff09;的观测数据纳入一个定期的全球网格。该 数据集经过插值处理&#xff0c;以填补网格上的空白&#x…

创意无限:11个设计圈热议的UI设计灵感网站集锦

无论你是一个经验丰富的UI设计师还是一个新的UI设计师&#xff0c;拥有一些高质量、可靠的UI设计网站灵感库都能加速你的设计过程。借助灵感资源&#xff0c;您可以更快、更有效地启动该项目。与此同时&#xff0c;优秀的UI设计网站也能帮助您探索新的设计解决方案&#xff0c;…

3DsMax展开管道UV,展开圆柱体UV,展开带有拐弯部分的UV

效果 3dsmax展开管道的UV 创建管道 创建样条线 制作弯曲部分 打开样条线先的顶点&#xff0c;选择样条线的顶点&#xff0c;不选中&#xff0c;开头和结尾的顶点&#xff0c;点击圆角 &#xff0c;鼠标移动到顶点上&#xff0c;左键点击顶点然后向上拖拽。 设置样条线可渲染…

隐私安全测试:保护您的数字世界

大家好&#xff0c;我是一名_全栈_测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家关注我&#xff0c;和我一起【分享测试知识&#xff0c;交流测试技术&#xff0c;趣聊行业热点】。 一、引言 在当今数字化的时代&#xff0…

安装Docker以及安装过程中的错误解决

一、纯享版教程&#xff0b;操作截图 环境&#xff1a;centOs 7 FinalShell &#xff01;&#xff01;&#xff01;此教程针对第一次安装docker的友友&#xff0c;如果已经安装过且报错的朋友&#xff0c;请移步报错合集。 1.卸载旧版本&#xff08;无论是否安装过都建议执…

C++11深度剖析

目录 &#x1f680; 前言&#xff1a;C11简介 一&#xff1a; &#x1f525; 统一的列表初始化&#x1f4ab; 2.1 &#xff5b;&#xff5d;初始化 二&#xff1a; &#x1f525; std::initializer_list &#x1f4ab; 2.1 std::initializer_list是什么类型&#x1f4ab; 2.2 s…

【LLM】-14-搭建问答系统

核心流程说明&#xff1a; 对用户的输入进行检验&#xff0c;验证其是否可以通过审核 API 的标准。若输入顺利通过审核&#xff0c;我们将进一步对产品目录进行搜索。若产品搜索成功&#xff0c;我们将继续寻找相关的产品信息。我们使用模型针对用户的问题进行回答。最后&…

C++ : namespace,输入与输出,函数重载,缺省参数

一&#xff0c;命名空间(namespace) 1.1命名空间的作用与定义 我们在学习c的过程中&#xff0c;经常会碰到命名冲突的情况。就拿我们在c语言中的一个string函数来说吧&#xff1a; int strncat 0; int main() {printf("%d", strncat);return 0; } 当我们运行之后&…

内网横向——常见系统传递攻击(1)

文章目录 一、哈希传递1.1 利用Mimikatz进行PTH1.2 利用Impacket进行PTH1.3 使用crackmapexec进行PTH1.4 使用PowerShell1.5 使用MSF进行哈希传递1.6 利用哈希传递登录远程桌面 二、票据传递2.1 MS14-068漏洞2.2 使用kekeo进行票据传递 网络拓扑&#xff1a; 攻击机kali IP&…

windows内存泄漏检查汇总

VLD(Visual Leak Detector) 下载 官方下载地址2.5 另一分支2.7 安装 点击运行安装