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

PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试

Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试


文章目录

  • I . PolygonMesh
    • 1. PolygonMesh 结构体
    • 2. Vertices 结构体与点云索引
    • 3. 测试 PolygonMesh
  • II. TextureMesh
    • 1. TextureMesh 结构体
    • 2. TexMaterial 结构体
    • 3. 纹理坐标与纹理坐标索引
    • 4. 测试 TextureMesh


以下简单记录以备忘.


I . PolygonMesh

1. PolygonMesh 结构体

先要建立没有纹理的 PolygonMesh, 一般都为三角形网格. ([pcl]/common/include/pcl/PolygonMesh.h)

#pragma once#include <algorithm>
#include <vector>
#include <ostream>// Include the correct Header path here
#include <pcl/PCLHeader.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/Vertices.h>namespace pcl
{struct PolygonMesh{PolygonMesh () = default;::pcl::PCLHeader  header;::pcl::PCLPointCloud2 cloud;std::vector< ::pcl::Vertices>  polygons;/* ... ... */} // namespace pcl

只要设置好 cloudpolygons 就可以. header 和 ros 中的 std_msgs/Header.msg 一致.

cloud 的类型是 ::pcl::PCLPointCloud2, 这种格式和 ros 中的 sensor_msgs/PointCloud2 Message 一致.

我们给点云输入数据时还是习惯于使用直观易懂的 pcl::PointCloud<pcl::PointXYZ>. 可以通过 fromPCLPointCloud2toPCLPointCloud2 来进行两者的转换.

polygons 存储的是一个一个的多边形网格的单元面元. 如果创建三角形网格, polygons vector 中的元素就是一个一个 ::pcl::Vertices 三角形面片.


2. Vertices 结构体与点云索引

看一下 ::pcl::Vertices 结构体定义能够比较清晰的理解. ([pcl]/common/include/pcl/Vertices.h)

#pragma once#include <pcl/memory.h>
#include <pcl/pcl_macros.h>
#include <pcl/types.h>#include <ostream>namespace pcl
{/** \brief Describes a set of vertices in a polygon mesh, by basically* storing an array of indices.*/struct Vertices{Vertices () = default;Indices vertices;public:using Ptr = shared_ptr<Vertices>;using ConstPtr = shared_ptr<const Vertices>;}; // struct Vertices/* ... ... */} // namespace pcl

而这个 Indices 是单元面元各个顶点 (点云 cloud 中的点 point) 在点云 cloud 中点的索引指标 (0 开始排序), 就是点云 cloud 中各个点输入时的顺序指标.

#pragma once/*** \file pcl/types.h** \brief Defines basic non-point types used by PCL* \ingroup common*/#include <pcl/pcl_config.h>
#include <pcl/pcl_macros.h>
#include <vector>#include <cstdint>#include <Eigen/Core>namespace pcl
{namespace detail {/*** \brief int_type::type refers to an integral type that satisfies template parameters* \tparam Bits number of bits in the integral type* \tparam Signed signed or unsigned nature of the type*/template <std::size_t Bits, bool Signed = true>struct int_type { using type = void; };/*** \brief helper type to use for `int_type::type`* \see int_type*/template <std::size_t Bits, bool Signed = true>using int_type_t = typename int_type<Bits, Signed>::type;template <>struct int_type<8, true> { using type = std::int8_t; };template <>struct int_type<8, false> { using type = std::uint8_t; };template <>struct int_type<16, true> { using type = std::int16_t; };template <>struct int_type<16, false> { using type = std::uint16_t; };template <>struct int_type<32, true> { using type = std::int32_t; };template <>struct int_type<32, false> { using type = std::uint32_t; };template <>struct int_type<64, true> { using type = std::int64_t; };template <>struct int_type<64, false> { using type = std::uint64_t; };/*** \brief number of bits in PCL's index type** Please use PCL_INDEX_SIZE when building PCL to choose a size best suited for your needs.* PCL 1.12 will come with default 32** PCL 1.11 has a default size = sizeof(int)*/constexpr std::uint8_t index_type_size = PCL_INDEX_SIZE;/*** \brief signed/unsigned nature of PCL's index type* Please use PCL_INDEX_SIGNED when building PCL to choose a type best suited for your needs.* Default: signed*/constexpr bool index_type_signed = PCL_INDEX_SIGNED;
}  // namespace detail/*** \brief Type used for an index in PCL** Default index_t = int for PCL 1.11, std::int32_t for PCL >= 1.12*/using index_t = detail::int_type_t<detail::index_type_size, detail::index_type_signed>;static_assert(!std::is_void<index_t>::value, "`index_t` can't have type `void`");/*** \brief Type used for an unsigned index in PCL** Unsigned index that mirrors the type of the index_t*/using uindex_t = detail::int_type_t<detail::index_type_size, false>;static_assert(!std::is_signed<uindex_t>::value, "`uindex_t` must be unsigned");/*** \brief Type used for indices in PCL* \todo Remove with C++20*/template <typename Allocator = std::allocator<index_t>>using IndicesAllocator = std::vector<index_t, Allocator>;/*** \brief Type used for indices in PCL*/using Indices = IndicesAllocator<>;/*** \brief Type used for aligned vector of Eigen objects in PCL*/template <typename T>using AlignedVector = std::vector<T, Eigen::aligned_allocator<T>>;
}  // namespace pcl

3. 测试 PolygonMesh

#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/conversions.h>
#include <pcl/io/ply_io.h>
#include <chrono>
#include <iostream>void generatePolygonMesh()
{pcl::PolygonMesh simple_polygon_mesh;// headersimple_polygon_mesh.header.frame_id = "odom";simple_polygon_mesh.header.seq = 0;// 获取当前时间点auto now = std::chrono::system_clock::now();// 计算从纪元开始的微秒数auto duration = now.time_since_epoch();auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();// The value represents microseconds since 1970-01-01 00:00:00 (the UNIX epoch)simple_polygon_mesh.header.stamp = microseconds;// cloudpcl::PointCloud<pcl::PointXYZ> raw_point_cloud;raw_point_cloud.push_back(pcl::PointXYZ(0.0, 1.0, 0.0)); // #0raw_point_cloud.push_back(pcl::PointXYZ(0.0, 0.0, 0.0)); // #1raw_point_cloud.push_back(pcl::PointXYZ(1.0, 0.0, 0.0)); // #2raw_point_cloud.push_back(pcl::PointXYZ(1.0, 1.0, -0.5)); // #3pcl::toPCLPointCloud2(raw_point_cloud, simple_polygon_mesh.cloud);// polygonsstd::vector< ::pcl::Vertices>  triangle_polygons;pcl::Vertices triangle_face_1;triangle_face_1.vertices.push_back(0);triangle_face_1.vertices.push_back(1);triangle_face_1.vertices.push_back(2);triangle_polygons.push_back(triangle_face_1);pcl::Vertices triangle_face_2;triangle_face_2.vertices.push_back(0);triangle_face_2.vertices.push_back(2);triangle_face_2.vertices.push_back(3);triangle_polygons.push_back(triangle_face_2);simple_polygon_mesh.polygons = triangle_polygons;std::cout << "========= simple_polygon_mesh ===========\n" << simple_polygon_mesh << std::endl;pcl::io::savePLYFile("output_mesh.ply", simple_polygon_mesh);
}int main()
{generatePolygonMesh();
}

生成的三角形网格

snapshot00

II. TextureMesh

1. TextureMesh 结构体

TextureMesh 在 PolygonMesh 基础上多了纹理部分, 以及纹理(像素)和网格(几何)之间的映射关系. 先看一下 TextureMesh 结构体的定义.

结构体内所有元素 tex_polygons、tex_materials 等都套了 2 层 std::vector, 这是因为每一个网格可以拥有不同的多个纹理.

#pragma once#include <Eigen/Core>
#include <string>
#include <pcl/PCLPointCloud2.h>
#include <pcl/Vertices.h>namespace pcl
{/** \author Khai Tran */struct TexMaterial{struct RGB{float r = 0;float g = 0;float b = 0;}; //RGB/** \brief Texture name. */std::string tex_name;/** \brief Texture file. */std::string tex_file;/** \brief Defines the ambient color of the material to be (r,g,b). */RGB         tex_Ka;/** \brief Defines the diffuse color of the material to be (r,g,b). */RGB         tex_Kd;/** \brief Defines the specular color of the material to be (r,g,b). This color shows up in highlights. */RGB         tex_Ks;/** \brief Defines the transparency of the material to be alpha. */float       tex_d;/** \brief Defines the shininess of the material to be s. */float       tex_Ns;/** \brief Denotes the illumination model used by the material.** illum = 1 indicates a flat material with no specular highlights, so the value of Ks is not used.* illum = 2 denotes the presence of specular highlights, and so a specification for Ks is required.*/int         tex_illum;}; // TexMaterial/** \author Khai Tran */struct TextureMesh{pcl::PCLPointCloud2  cloud;pcl::PCLHeader  header;/** \brief polygon which is mapped with specific texture defined in TexMaterial */std::vector<std::vector<pcl::Vertices> >    tex_polygons;/** \brief UV coordinates */std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > tex_coordinates;/** \brief define texture material */std::vector<pcl::TexMaterial>               tex_materials;/** \brief Specifies which texture coordinates from tex_coordinates each polygon/face uses.* The vectors must have the same sizes as in tex_polygons, but the pcl::Vertices* may be empty for those polygons/faces that do not use coordinates.*/std::vector<std::vector<pcl::Vertices> >    tex_coord_indices;public:using Ptr = shared_ptr<pcl::TextureMesh>;using ConstPtr = shared_ptr<const pcl::TextureMesh>;}; // struct TextureMeshusing TextureMeshPtr = TextureMesh::Ptr;using TextureMeshConstPtr = TextureMesh::ConstPtr;
} // namespace pcl

2. TexMaterial 结构体

tex_name: 材质的名称, 用于在模型中引用此材质.

tex_file: 纹理图像文件的路径, 通常为.png、.jpg 等格式.

tex_Ka: 环境光颜色, 控制材质在全局光照下的基础颜色.

tex_Kd: 漫反射颜色, 控制材质在光线照射下的基本颜色 (最主要的颜色成分).

tex_Ks: 镜面反射颜色, 控制材质高光的颜色 (通常与金属性相关).

tex_d: 透明度值, 范围 0.0 (完全透明) 到 1.0 (完全不透明).

tex_Ns: 光泽度值, 范围 0~1000+, 值越大高光越集中 (例如, 塑料≈300, 金属≈800).

tex_illum: 光照模型编号, 控制材质的渲染方式. 设为1 表示一个没有镜面高光的平面材质,所以不使用镜面反射颜色(Ks)的值. 设为 2 表示存在镜面高光,因此需要指定镜面反射颜色 (Ks).

material.tex_name = “my_texture”; // 千万不要命名为 “texture”!

会引发 “error C1105: cannot call a non-function”.

避免使用以下保留名称作为变量名: texturepositionnormalcolormatrixviewprojection


3. 纹理坐标与纹理坐标索引

纹理坐标 UV coordinates 可看做是归一化的像素坐标, 纹理坐标索引就是 UV 坐标的标号. 通过为每个 PolygonMesh 的顶点 Vertex 指定一个像素的 UV 坐标索引, 而由顶点定义的面元内部区域中的任意点就可以通过线性插值计算得到对应的 UV 坐标. 这样就实现了图像纹理坐标到三维模型表面坐标之间的映射, 进而就能在三维网格表面贴图和渲染了.

需要说明利用 OpenCV 加载的图像坐标的原点在左上角, 这不同于 OpenGL 的原点左下角设置. 而渲染引擎一般使用 OpenGL (pcl 库中也是如此), 所以对 UV 坐标中的 V 坐标需要翻转一下.

std::vector<                 // 第一层向量:材质组(Material Groups)std::vector<               // 第二层向量:每个材质组中的所有UV坐标Eigen::Vector2f,         // UV坐标点(U,V),使用Eigen库的二维向量Eigen::aligned_allocator<Eigen::Vector2f>  // 内存对齐分配器(确保SSE优化)>
> tex_coordinates;

看似很严格定义的 std::vector<std::vector<pcl::Vertices> > tex_coord_indices, 在 libpcl-dev 1.14.0 还没有起作用. UV 索引和 PolygonMesh 各个顶点索引之间就是顺序对应, 即 tex_polygons[i][j] 对应 tex_coordinates[i][j].

std::vector<                // 第一层向量:材质组(Material Groups)std::vector<              // 第二层向量:每个材质组中的多边形(Polygons)pcl::Vertices           // 每个多边形的顶点对应的 UV 坐标索引>
> tex_coord_indices;

4. 测试 TextureMesh

#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/conversions.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/TextureMesh.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <filesystem>void visualizeTexturedMesh(const pcl::TextureMesh& tex_mesh) 
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Mesh Viewer"));// 添加网格到可视化器if (!viewer->addTextureMesh(tex_mesh, "ploygon_mesh")) {std::cerr << "Failed to add texture mesh!" << std::endl;return;}// 设置显示参数viewer->setBackgroundColor(0.4, 0.698, 1.0);viewer->setSize(1280, 720);                     // 窗口尺寸viewer->addCoordinateSystem(0.1, "axis", 0);viewer->addText("Texture Mesh Viewer\nPress Q to exit", 10, 10, 20, 1.0, 1.0, 1.0, "help");while (!viewer->wasStopped()) {viewer->spinOnce(100);  // 更新频率100ms}
}pcl::TextureMesh generateTextureMesh()
{pcl::TextureMesh simple_texture_mesh;// 1 导入多边形网格(点云+网格), 并设置纹理网格的点云和网格pcl::PolygonMesh polyon_mesh;pcl::io::loadPLYFile("./output_mesh.ply", polyon_mesh);simple_texture_mesh.cloud = polyon_mesh.cloud;simple_texture_mesh.header = polyon_mesh.header;simple_texture_mesh.tex_polygons.push_back(polyon_mesh.polygons);// 2 设置 UV 映射std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f>> tex_coords;float u_0 = 0.0;float v_0 = 0.0;tex_coords.emplace_back(u_0, 1.0f - v_0); // OpenGL坐标系需要翻转Vfloat u_1 = 0.0;float v_1 = 1.0;tex_coords.emplace_back(u_1, 1.0f - v_1); float u_2 = 1.0;float v_2 = 1.0;tex_coords.emplace_back(u_2, 1.0f - v_2); float u_3 = 1.0;float v_3 = 0.0;tex_coords.emplace_back(u_3, 1.0f - v_3); simple_texture_mesh.tex_coordinates.push_back(tex_coords);// 3 设置纹理材质std::string image_path = "../image.png";cv::Mat image = cv::imread(image_path);// 设置纹理材质pcl::TexMaterial material;material.tex_file = "image.png";material.tex_name = "my_texture";  // 千万不要命名为 "texture"!// 增加漫反射强度(允许值 >1.0)material.tex_Kd.r = 1.5;material.tex_Kd.g = 1.5;material.tex_Kd.b = 1.5; // 增强环境光反射material.tex_Ka.r = 0.6; material.tex_Ka.g = 0.6; material.tex_Ka.b = 0.6;           // 添加自发光效果(模拟亮度提升)material.tex_illum = 1;simple_texture_mesh.tex_materials.push_back(material);std::string img_name_new{"image.png"};cv::imwrite(img_name_new, image);return simple_texture_mesh;
}int main()
{pcl::TextureMesh tex_mesh = generateTextureMesh();visualizeTexturedMesh(tex_mesh);
}

纹理原图

image

纹理映射后的效果

snapshot01

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/woyaomaishu2/article/details/148018953
本文作者:wzf@robotics_notes


相关文章:

PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试

Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试 文章目录 I . PolygonMesh1. PolygonMesh 结构体2. Vertices 结构体与点云索引3. 测试 PolygonMesh II. TextureMesh1. TextureMesh 结构体2. TexMaterial 结构体3. 纹理坐标与纹理坐标索引4. 测试 TextureMesh 以下…...

CSS面试题汇总

在前端开发领域&#xff0c;CSS 是一项不可或缺的技术。无论是页面布局、样式设计还是动画效果&#xff0c;CSS 都扮演着重要的角色。因此&#xff0c;在前端面试中&#xff0c;CSS 相关的知识点往往是面试官重点考察的内容。为了帮助大家更好地准备面试&#xff0c;本文汇总了…...

光谱相机的空间分辨率和时间分辨率

一、空间分辨率 ‌定义与参数‌ ‌概念‌&#xff1a;指单个像素对应实际地物的最小尺寸&#xff0c;常用地面采样距离&#xff08;GSD&#xff0c;单位&#xff1a;米&#xff09;或像素大小&#xff08;单位&#xff1a;微米&#xff09;表示。 ‌分类‌&#xff1a; 高空…...

【研0学习计划表】

前言 以下学习计划并不固定&#xff1a; 1.若当前阶段的学习任务学习结束&#xff0c;对下一阶段的学习计划进行适当调整&#xff0c;提前进入下一阶段学习任务。 若当前阶段学习任务未完成&#xff0c;则根据每一阶段的学习情况&#xff0c;进行学习总结&#xff0c;然后对下…...

还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍

在当今激烈的数字化竞争中&#xff0c;文档处理效率直接影响企业的决策与响应速度。然而&#xff0c;许多办公平台仅支持基础流程&#xff0c;查阅、批注和修改仍需借助外部工具&#xff0c;增加了操作复杂性和沟通成本。本文将探讨如何在自己的网站、平台、系统或者服务中集成…...

机器学习前言2

1.机器学习 2.机器学习模型 3.模型评价方法 4.如何选择合适的模型 介绍 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能&#xff08;AI&#xff09;的核心分支&#xff0c;致力于通过数据和算法让计算机系统自动“学习”并改进性能&#xff0c;而无需显式编…...

在多个SpringBoot程序中./相对路径下隐患、文件覆盖问题

概述 两个 Spring Boot 应用生成的配置文件被覆盖&#xff0c;是因为 ​相对路径的解析依赖于当前工作目录&#xff08;Working Directory&#xff09;​&#xff0c;而你可能在运行应用时未正确设置各自的工作目录。以下是具体原因和解决方案&#xff1a; 原因分析 ​相对路径…...

弦理论的额外维度指的是什么,宇宙中有何依据

弦理论中的额外维度是解释微观世界与宏观宇宙矛盾的关键假设之一。它们并非科幻中的平行宇宙&#xff0c;而是通过严谨的数学框架提出&#xff0c;并可能留下可观测的宇宙学痕迹。以下是具体解析&#xff1a; 一、弦理论为何需要额外维度&#xff1f; 数学自洽性要求 弦理论中…...

FC7300 GPT MCAL 配置引导

一、配置约束 FCPIT:仅FC7240型号芯片支持。如果GPT模块与PWM/ICU/OCU模块使用相同的FTU实例,配置工具将报告一个错误。如果GPT通道使用FTU,时钟源来自PCC,则GptFtuChannelClkSrc必须选择GPT_FTU_BUS_CLK。二、MCU 组件 - 配置WDG采用的定时器时钟 Examle:WDG选用AONTIMER…...

LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(2)流编辑器系统

Flow Editor System | langflow-ai/langflow | DeepWiki 流编辑器系统 相关源文件 流编辑器系统是 Langflow 的核心交互式组件&#xff0c;允许用户直观地创建、编辑和管理 LLM 驱动的应用程序。它提供了一个直观的画布&#xff0c;用户可以在其中添加节点、将其与边缘连接并…...

okcc呼叫中心系统搭建的方案方式

传统企业呼叫中心多采用 PC和手机软件&#xff0c;很难与客户保持良好的沟通。因此&#xff0c;需要建设一套呼叫中心系统来实现与客户实时有效沟通。那么&#xff0c;呼叫中心搭建的方案方式有哪些呢?下面详细介绍一下。 呼叫中心系统的搭建方式需根据企业规模、预算和业务需…...

asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术

IHttpHandler&#xff0c;不支持分块传输编码&#xff08;Chunked Transfer&#xff09;吧&#xff1f; IHttpHandler 对分块传输编码的支持 实际上&#xff0c;IHttpHandler 完全支持分块传输编码&#xff08;Chunked Transfer Encoding&#xff09;&#xff0c;但具体行为取…...

芍药BAHD酰基转移酶-文献精读128

PoDPBT, a BAHD acyltransferase, catalyses the benzoylation in paeoniflorin biosynthesis in Paeonia ostii PoDPBT&#xff0c;一种BAHD酰基转移酶&#xff0c;在芍药&#xff08;Paeonia ostii&#xff09;中催化芍药苷生物合成中的苯甲酰化反应。 摘要 PoDPBT是属于BA…...

GTS-400 系列运动控制器板卡介绍(三十三)---运动程序单线程累加求和

运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载运动…...

C# 面向对象 构造函数带参无参细节解析

继承类构造时会先调用基类构造函数&#xff0c;不显式调用基类构造函数时&#xff0c;默认调用基类无参构造函数&#xff0c;但如果基类没有写无参构造函数&#xff0c;会无法调用从而报错&#xff1b;此时&#xff0c;要么显式的调用基类构造函数&#xff0c;并按其格式带上参…...

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统

在当今的工业自动化领域&#xff0c;通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们分别在不同的应用场景中发挥着重要作用。然而&#xff0c;有时我们可能需要将这两种协议进行转换&#xff0c;以实现不同设备之间的无缝通…...

【编译原理】词法分析器

//简单实现&#xff0c;伪代码 int code,value; strToken :" "; //置strToken为空串 GetChar();GetBC(); if(IsLetter()) beginwhile(IsLetter() or IsDigit())beginConcat();GetChar();endRetract();code:Reserve();if(code0)beginvalue:InsertId(strToken);retu…...

记录一次vue项目页面内嵌iframe页面实现跨域上传和下载附件的功能

功能背景&#xff1a;项目部署在外网&#xff0c;然后其中有一个功能需要上传下载附件&#xff0c;附件是上传到华为云对象存储服务OBS中&#xff08;私有云&#xff09;&#xff0c;所以采用iframe嵌套页面的方式解决跨域问题。 实现思路&#xff1a; 1、父窗口封装一个组件专…...

【Win32 API】 lstrcpyA()

作用 将字符串复制到指定的字符串缓冲区。 函数 LPSTR lstrcpyA(LPSTR lpString1, LPCSTR lpString2); 参数 lpString1 类型&#xff1a;LPTSTR 一个缓冲区&#xff0c;用于接收由 lpString2 参数指向的字符串的内容。 缓冲区必须足够大才能包含字符串&#xff0c;包括终止…...

报表控件stimulsoft教程:如何在报表和仪表板中创建热图

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…...

Axure疑难杂症:剖析面包屑导航“用户不迷路”(玩转导航)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:剖析面包屑导航“用户不迷路” 主要内容:面包屑导航各种做法 应用场景:页面导航、页面路径、用户选择路径、…...

中exec()函数因$imagePath参数导致的命令注入漏洞

exec(zbarimg -q . $imagePath, $barcodeList, $returnVar); 针对PHP中exec()函数因$imagePath参数导致的命令注入漏洞&#xff0c;以下是安全解决方案和最佳实践&#xff1a; 一、漏洞原理分析 直接拼接用户输入$imagePath到系统命令中&#xff0c;攻击者可通过注入特殊字…...

HTML常用标签用法全解析:构建语义化网页的核心指南

HTML作为网页开发的基石&#xff0c;其标签的合理使用直接影响页面的可读性、SEO效果及维护性。本文系统梳理HTML核心标签的用法&#xff0c;结合语义化设计原则与实战示例&#xff0c;助你构建规范、高效的网页结构。 一、基础结构与排版标签 1.1 文档结构 <!DOCTYPE htm…...

【Linux】动静态库链接原理

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——动静态库链接原理 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础…...

Axure设计的“广东省网络信息化大数据平台”数据可视化大屏

在数据驱动决策的时代&#xff0c;数据可视化大屏成为了展示数据、洞察趋势的重要工具。今天&#xff0c;让我们一同深入了解由Axure设计的“广东省网络信息化大数据平台”数据可视化大屏&#xff0c;看看它如何通过精心的布局和丰富的图表类型&#xff0c;将复杂的数据以直观易…...

linux安装宝塔面板到数据盘

操作很简单&#xff0c;假如数据盘挂载在cipan1&#xff0c;在数据盘新建目录www&#xff0c;为了方便对应。 执行一下命令&#xff0c;创建软连接 ln -s /cipan1/www www 此时&#xff0c;根目录就出现了www文件夹 下面正常安装宝塔即可...

数学实验(Matlab编程基础)

一、函数文件 Matlab编程基础 Matlab作为一种广泛应用于科学计算的工具软件&#xff0c;不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能&#xff0c;同时也具有和C、FORTRAN等高级语言一样进行程序设计 利用Matlab的程序控制功能&#xff0c;可以将有关Ma…...

不同坐标系下MATLAB绘制阵列的方向图

不同坐标系下MATLAB绘制阵列的方向图 球坐标系&#xff0c;极坐标系、直角坐标系 文章目录 前言一、极坐标系二、球坐标系三、直角坐标系总结 前言 \;\;\;\;\; 在阵列信号处理和天线设计中&#xff0c;方向图&#xff08;Pattern&#xff09;是描述波束形成性能的关键工具&…...

python可视化:北方省市人口流动与春运数据综合分析5

python可视化&#xff1a;北方省市人口流动与春运数据综合分析5 一、北方省市常住人口数据及变化趋势&#xff08;2023-2024第一季度&#xff09; 1. 主要城市常住人口数据&#xff08;按城市等级分类&#xff09; 城市类型2023Q1常住人口(万)2024Q1常住人口(万)变化量(万)变…...

Java并发编程-线程池(四)

文章目录 线程池实现原理WorkerWorker 核心设计总结 runWorker(Worker w)总结 线程池实现原理 上一篇我们看了 addWork 方法&#xff0c;那接下来就让我们详细看看内部类Worker。 Worker private final class Workerextends AbstractQueuedSynchronizerimplements Runnable …...

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列&#xff0c;使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法&#xff0c;可以高效地解决该问题。具体步骤为&#xff1a;初始化一个结果列表&#xff0c;遍历 words 数组&#xff0c;检查当前字符串的…...

筑牢信息安全防线:涉密计算机与互联网隔离的理论实践与风险防控

在数字化时代&#xff0c;信息安全已成为国家安全体系的重要组成部分。涉密计算机作为承载敏感信息的核心载体&#xff0c;其安全防护工作直接关系到国家利益与社会稳定。违规连接互联网这一行为&#xff0c;如同在严密的防护体系中打开一扇危险的"暗门"&#xff0c;…...

sqli-labs靶场29-31关(http参数污染)

目录 前言 less29&#xff08;单引号http参数污染&#xff09; less30&#xff08;双引号http参数污染&#xff09; less31(双引号括号http参数污染) 前言 在JSP中&#xff0c;使用request.getParameter("id")获取请求参数时&#xff0c;如果存在多个同名参数&a…...

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL 场景说明&#xff1a; 先有项目需要读取生产库数据&#xff0c;但是不能直接读取生产库数据&#xff0c;需要把生产数据同步到一个中间库&#xff0c;下游系统从中间库读取数据。 生产库mysql - OGG - 中间库…...

linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉

当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时&#xff0c;可能由多种原因导致。以下是常见排查步骤和解决方案&#xff1a; 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索&#xff0c;建议先获取完整日志&#xff1a; 1. 查看…...

pytorch 14.3 Batch Normalization综合调参实践

文章目录 一、Batch Normalization与Batch_size综合调参二、复杂模型上的Batch_normalization表现1、BN对复杂模型&#xff08;sigmoid&#xff09;的影响2、模型复杂度对模型效果的影响3、BN对复杂模型&#xff08;tanh&#xff09;的影响 三、包含BN层的神经网络的学习率优化…...

供应链安全检测系列技术规范介绍之一|软件成分分析

软件成分分析的概念及意义 软件成分分析Software Compostition Analysis&#xff08;SCA&#xff09;是一种用于管理开源组件应用安全的方法。软件成分分析系统可以快速跟踪和分析应用软件的开源组件&#xff0c;发现相关组件、支持库以及它们之间直接和间接依赖关系&#xff0…...

pytorch 15.1 学习率调度基本概念与手动实现方法

文章目录 一、学习率对模型训练影响 二、学习率调度基本概念与手动实现方法1.模型调度基本概念2.手动实现学习率调度3.常用学习率调度思路 从本节开始&#xff0c;我们将介绍深度学习中学习率优化方法。学习率作为模型优化的重要超参数&#xff0c;在此前的学习中&#xff0c;我…...

c++ 类的语法4

测试析构函数、虚函数、纯虚函数&#xff1a; void testClass5() {class Parent {public:Parent(int x) { cout << "Parent构造: " << x << endl; }~Parent() {cout << "调用Parent析构函数" << endl;}virtual string toSt…...

品铂科技在UWB行业地位综述(2025年更新)

一、行业领先地位‌ ‌国内UWB领域头部企业‌ 在2025年中国UWB企业综合实力排行榜中位列第一&#xff0c;技术研发、市场份额及行业影响力均处于领先地位。连续多年获评中国物联网产业联盟“中国最有影响力物联网定位企业”。 2.‌全球技术竞争力‌ .2016年IPSN微软国际室内…...

muduo库EventLoop模块详解

muduo库EventLoop模块深度解析 EventLoop是muduo网络库实现Reactor模型的核心调度中枢&#xff0c;负责驱动整个事件循环机制&#xff0c;协调Poller、Channel、TimerQueue等组件的工作。其设计遵循"One Loop Per Thread"原则。 一、核心职责与设计思想 1. 核心职责…...

循环导入(Circular Import) 错误

ImportError: cannot import name event_type_data_tree from partially initialized module routers.ticket (most likely due to a circular import) (E:\ai12345\backend\app\routers\ticket.py) 这是什么错&#xff0c;中文回答 这个错误是 循环导入&#xff08;Circular …...

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…...

奥运数据可视化:探索数据讲述奥运故事

在数据可视化的世界里&#xff0c;体育数据因其丰富的历史和文化意义&#xff0c;常常成为最有吸引力的主题之一。今天我要分享一个令人着迷的奥运数据可视化项目&#xff0c;它巧妙地利用交互式图表和动态动画&#xff0c;展现了自1896年至今奥运会的发展历程和各国奥运成就的…...

linux环境下 安装svn并且创建svn版本库详细教程

​一、安装SVN​ ​通过yum安装Subversion​ 在Linux系统中执行以下命令安装&#xff1a; yum install subversion -y 安装完成后&#xff0c;验证版本&#xff1a; svnserve --version ​二、创建版本库 ​选择存储路径并创建目录​ 通常将版本库放在/var/svn或/usr/local/…...

STM32控制电机

初始化时钟&#xff1a;在 STM32 的程序中&#xff0c;初始化系统时钟&#xff0c;一般会使用 RCC&#xff08;Reset and Clock Control&#xff09;相关函数来配置时钟。例如&#xff0c;对于 STM32F103 系列&#xff0c;可能会使用 RCC_APB2PeriphClockCmd 函数来使能 GPIO 和…...

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库&#xff08;通用稳定版仓库&#xff09; codename$(…...

微服务初步学习

系统架构演变过程 一、单体架构 前后端都在一个项目中&#xff0c;包括我们现在的前后端分离开发&#xff0c;都可以看作是一个单体项目。 二、集群架构 把一个服务部署多次&#xff0c;可以解决服务不够的问题&#xff0c;但是有些不必要的功能也跟着部署多次。 三、垂直架…...

旧 docker 版本通过 nvkind 搭建虚拟多节点 gpu 集群的坑

踩坑 参考nvkind教程安装到Setup这一步&#xff0c;由于docker版本较旧&#xff0c;–cdi.enabled 和 config 参数执行不了 手动修改 /etc/docker/daemon.json 配置文件 "features": {"cdi": true}手动修改 /etc/nvidia-container-runtime/config.toml 配…...

Fabric 服务端插件开发简述与聊天事件监听转发

原文链接&#xff1a;Fabric 服务端插件开发简述与聊天事件监听转发 < Ping通途说 0. 引言 以前写过Spigot的插件&#xff0c;非常简单&#xff0c;仅需调用官方封装好的Event类即可。但Fabric这边在开发时由于官方文档和现有互联网资料来看&#xff0c;可能会具有一定的误…...