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

点云数据处理--splat转3dtiles

文章目录

  • 处理流程简介
  • 核心功能实现
    • 数据读取与格式转换
      • 数据读取
      • splat转gltf
    • 点云数据分割
      • 定义四叉树
      • 递归生成3dtiles瓦片
    • 生成tileset.json
      • 递归生成tileset.json
      • 计算box
    • 主函数调用
    • 渲染
  • 下一步工作
    • 性能优化
    • 渲染效果调优
    • 其他

源码地址: github

处理流程简介

基本流程:

  • 读取点云数据。
  • 制作tile
    • 构建四叉树
    • 分割点云
    • 将点云转换为glTF格式。
  • 生成配置文件tileset.json。

前置知识:

  • glTF教程
  • glTF2.0 高斯扩展
  • 3dtiles 1.1 规范

核心功能实现

数据读取与格式转换

数据读取

def read_splat_file(file_path):"""读取二进制格式的 Splat 文件:param file_path: Splat 文件路径:return: 包含位置、缩放、颜色、旋转数据的字典"""with open(file_path, 'rb') as f:# 初始化存储数据的列表positions = []scales = []colors = []rotations = []# 逐点读取数据while True:# 读取位置(3个 Float32,x, y, z)position_data = f.read(3 * 4)  # 3个 Float32,每个4字节if not position_data:break  # 文件结束x, y, z = struct.unpack('3f', position_data)positions.append([x, y, z])# 读取缩放(3个 Float32,sx, sy, sz)scale_data = f.read(3 * 4)  # 3个 Float32,每个4字节sx, sy, sz = struct.unpack('3f', scale_data)scales.append([sx, sy, sz])# 读取颜色(4个 uint8,r, g, b, a)color_data = f.read(4 * 1)  # 4个 uint8,每个1字节r, g, b, a = struct.unpack('4B', color_data)colors.append([r, g, b, a])#print("r, g, b, a:",[r, g, b, a])# 读取旋转(4个 uint8,i, j, k, l)rotation_data = f.read(4 * 1)  # 4个 uint8,每个1字节i, j, k, l = struct.unpack('4B', rotation_data)rotations.append([i, j, k, l])# 将列表转换为 NumPy 数组positions = np.array(positions, dtype=np.float32)scales = np.array(scales, dtype=np.float32)colors = np.array(colors, dtype=np.uint8)rotations = np.array(rotations, dtype=np.uint8)# 返回解析的数据return {'positions': positions,'scales': scales,'colors': colors,'rotations': rotations}

splat转gltf

遵循3dtiles 1.1 规范,在glTF 2.0 基础上,增加高斯扩展。

def splat_to_gltf_with_gaussian_extension(positions, colors, scales, rotations, output_path):"""将 Splat 数据转换为支持 KHR_gaussian_splatting 扩展的 glTF 文件:param positions: 位置数据(Nx3 的浮点数数组):param colors: 颜色数据(Nx4 的 uint8 数组,RGBA):param scales: 缩放数据(Nx3 的浮点数数组):param rotations: 旋转数据(Nx4 的 uint8 数组,IJKL 四元数):param output_path: 输出的 glTF 文件路径"""# 将颜色和旋转数据归一化到 [0, 1] 范围#normalized_colors = colors / 255.0normalized_rotations = rotations / 255.0# 创建 GLTF 对象gltf = GLTF2()# 添加 KHR_gaussian_splatting 扩展gltf.extensionsUsed = ["KHR_gaussian_splatting"]# 创建 Bufferbuffer = Buffer()gltf.buffers.append(buffer)# 将数据转换为二进制positions_binary = positions.tobytes()colors_binary = colors.tobytes() #normalized_colors.tobytes()scales_binary = scales.tobytes()rotations_binary = normalized_rotations.tobytes()# 创建 BufferView 和 Accessor 用于位置数据positions_buffer_view = BufferView(buffer=0,byteOffset=0,byteLength=len(positions_binary),target=34962  # ARRAY_BUFFER)positions_accessor = Accessor(bufferView=0,componentType=5126,  # FLOATcount=len(positions),type="VEC3",max=positions.max(axis=0).tolist(),min=positions.min(axis=0).tolist())gltf.bufferViews.append(positions_buffer_view)gltf.accessors.append(positions_accessor)# 创建 BufferView 和 Accessor 用于颜色数据colors_buffer_view = BufferView(buffer=0,byteOffset=len(positions_binary),byteLength=len(colors_binary),target=34962  # ARRAY_BUFFER)colors_accessor = Accessor(bufferView=1,componentType=5121,  # UNSIGNED BYTEcount=len(colors), #,len(normalized_colors),#type="VEC4")gltf.bufferViews.append(colors_buffer_view)gltf.accessors.append(colors_accessor)# 创建 BufferView 和 Accessor 用于旋转数据rotations_buffer_view = BufferView(buffer=0,byteOffset=len(positions_binary) + len(colors_binary) ,byteLength=len(rotations_binary),target=34962  # ARRAY_BUFFER)rotations_accessor = Accessor(bufferView=2,componentType=5126,  # FLOATcount=len(normalized_rotations),type="VEC4")gltf.bufferViews.append(rotations_buffer_view)gltf.accessors.append(rotations_accessor)# 创建 BufferView 和 Accessor 用于缩放数据scales_buffer_view = BufferView(buffer=0,byteOffset=len(positions_binary) + len(colors_binary)+ len(rotations_binary),byteLength=len(scales_binary),target=34962  # ARRAY_BUFFER)scales_accessor = Accessor(bufferView=3,componentType=5126,  # FLOATcount=len(scales),type="VEC3")gltf.bufferViews.append(scales_buffer_view)gltf.accessors.append(scales_accessor)# 创建 Mesh 和 Primitiveprimitive = Primitive(attributes={"POSITION": 0,"COLOR_0": 1,"_ROTATION": 2,"_SCALE": 3},mode=0,  # POINTSextensions={"KHR_gaussian_splatting": {"positions": 0,"colors": 1,"scales": 2,"rotations": 3}})mesh = Mesh(primitives=[primitive])gltf.meshes.append(mesh)# 创建 Node 和 Scenenode = Node(mesh=0)gltf.nodes.append(node)scene = Scene(nodes=[0])gltf.scenes.append(scene)gltf.scene = 0# 将二进制数据写入 Buffergltf.buffers[0].uri = "data:application/octet-stream;base64," + \base64.b64encode(positions_binary + colors_binary + rotations_binary + scales_binary ).decode("utf-8")# 保存为 glTF 文件gltf.save(output_path)print(f"glTF 文件已保存到: {output_path}")

点云数据分割

定义四叉树

定义四叉树类,包含基本方法,初始化、插入、分割、判断点是否在边界范围内。

#四叉树
class QuadTreeNode:def __init__(self, bounds, capacity=100000):"""初始化四叉树节点。:param bounds: 节点的边界 (min_x, min_y, max_x, max_y):param capacity: 节点容量(每个节点最多存储的点数)"""self.bounds = boundsself.capacity = capacityself.points = []self.children = Noneself.colors = []self.scales = []self.rotations = []def insert(self, point,color,scale,rotation):"""将点插入四叉树。"""if not self._contains(point):return Falseif len(self.points) < self.capacity:self.points.append(point)self.colors.append(color)self.scales.append(scale)self.rotations.append(rotation)return Trueelse:if self.children is None:self._subdivide()for child in self.children:if child.insert(point,color,scale,rotation):return Truereturn Falsedef _contains(self, point):"""检查点是否在节点边界内。"""x, y, _ = pointmin_x, min_y, max_x, max_y = self.boundsreturn min_x <= x < max_x and min_y <= y < max_ydef _subdivide(self):"""将节点划分为四个子节点。"""min_x, min_y, max_x, max_y = self.boundsmid_x = (min_x + max_x) / 2mid_y = (min_y + max_y) / 2self.children = [QuadTreeNode((min_x, min_y, mid_x, mid_y), self.capacity),QuadTreeNode((mid_x, min_y, max_x, mid_y), self.capacity),QuadTreeNode((min_x, mid_y, mid_x, max_y), self.capacity),QuadTreeNode((mid_x, mid_y, max_x, max_y), self.capacity)]for index, point in enumerate(self.points):for child in self.children:if child.insert(point,self.colors[index],self.scales[index],self.rotations[index]):breakself.points = []self.colors = []self.scales = []self.rotations = []

递归生成3dtiles瓦片

def generate_3dtiles(node, output_dir, tile_name):"""递归生成 3D Tiles。"""if node.children is not None:for i, child in enumerate(node.children):generate_3dtiles(child, output_dir, f"{tile_name}_{i}")else:if len(node.points) > 0:points = np.array(node.points)colors = np.array(node.colors) scales = np.array(node.scales)rotations = np.array(node.rotations)splat_to_gltf_with_gaussian_extension(points, colors,scales,rotations, f"{output_dir}/{tile_name}.gltf")#tile = create_pnts_tile(points, colors)#tile.save_to(f"{output_dir}/{tile_name}.gltf")

生成tileset.json

递归生成tileset.json

generate_tileset_json

def generate_tileset_json(output_dir, root_node, bounds, geometric_error=100):"""递归生成符合 3D Tiles 1.1 规范的 tileset.json 文件。:param output_dir: 输出目录:param root_node: 四叉树的根节点:param bounds: 根节点的边界 (min_x, min_y, min_z, max_x, max_y, max_z):param geometric_error: 几何误差"""def build_tile_structure(node, tile_name, current_geometric_error):"""递归构建 Tile 结构。:param node: 当前四叉树节点:param tile_name: 当前 Tile 的名称:param current_geometric_error: 当前 Tile 的几何误差:return: 当前 Tile 的结构"""# 当前 Tile 的 boundingVolume# 计算 boundingVolumeif is_geographic_coordinate:  # 如果是地理坐标系bounding_volume = {"region": compute_region(node.points)}else:  # 如果是局部坐标系bounding_volume = {"box": compute_box(node.points)}# 当前 Tile 的内容content = {"uri": f"{tile_name}.gltf"}# 子节点列表children = []if node.children is not None:for i, child in enumerate(node.children):child_tile_name = f"{tile_name}_{i}"children.append(build_tile_structure(child, child_tile_name, current_geometric_error / 2))# 当前 Tile 的结构tile_structure = {"boundingVolume": bounding_volume,"geometricError": current_geometric_error,"refine": "ADD",  # 细化方式"content": content}# 如果有子节点,则添加到 children 中if children:tile_structure["children"] = children#tile_structure["content"] = ""del tile_structure["content"]return tile_structure# 构建根节点的 Tile 结构root_tile_structure = build_tile_structure(root_node, "tile_0", geometric_error)# tileset 结构tileset = {"asset": {"version": "1.1","gltfUpAxis": "Z"  # 默认 Z 轴向上},"geometricError": geometric_error,"root": root_tile_structure}# 写入文件with open(f"{output_dir}/tileset.json", "w") as f:json.dump(tileset, f,cls=NumpyEncoder, indent=4)

数据格式转换

class NumpyEncoder(json.JSONEncoder): def default(self, obj):  if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,  np.int16, np.int32, np.int64, np.uint8,  np.uint16, np.uint32, np.uint64)):  return int(obj)  elif isinstance(obj, (np.float_, np.float16, np.float32,np.float64)):  return float(obj)  elif isinstance(obj, (np.ndarray,)):  return obj.tolist()  return json.JSONEncoder.default(self, obj)

计算box

def compute_box(points):"""计算点云数据的 box 范围。:param points: 点云数据 (Nx3 数组,每行是 [x, y, z]):return: box 范围 [centerX, centerY, centerZ, xDirX, xDirY, xDirZ, yDirX, yDirY, yDirZ, zDirX, zDirY, zDirZ]"""# 计算中心点center = np.mean(points, axis=0)# 计算半长向量min_coords = np.min(points, axis=0)max_coords = np.max(points, axis=0)half_size = (max_coords - min_coords) / 2# 构造 boxbox = [center[0], center[1], center[2],  # 中心点half_size[0], 0, 0,               # X 轴方向0, half_size[1], 0,               # Y 轴方向0, 0, half_size[2]                # Z 轴方向]return box

主函数调用

def main():input_path=r"D:\data\splat\model.splat"output_dir = r'D:\code\test\py3dtiles\cesium-splat-viewer\data\outputs\model'# 读取 .splat 文件splat_data=read_splat_file(input_path)positions=splat_data['positions']scales=splat_data['scales']colors=splat_data['colors']rotations=splat_data['rotations']points=positions# 创建四叉树根节点min_x = np.min(points[:, 0], axis=0)min_y = np.min(points[:, 1], axis=0)max_x = np.max(points[:, 0], axis=0)max_y = np.max(points[:, 1], axis=0)root = QuadTreeNode((min_x, min_y, max_x, max_y),100000)# 将点插入四叉树for index, point in enumerate(points):root.insert(point,colors[index],scales[index],rotations[index])# 生成 3D Tiles   generate_3dtiles(root, output_dir, "tile_0")# 生成 tileset.jsonbounds = [min_x, min_y, np.min(points[:, 2]), max_x, max_y, np.max(points[:, 2])]generate_tileset_json(output_dir, root, bounds)if __name__ == "__main__":main()

渲染

编译cesium的splat-shader版本,参考示例代码3D Tiles Gaussian Splatting.html实现。

async function loadTileset() {try {const tileset = await Cesium.Cesium3DTileset.fromUrl("http://localhost:8081/data/outputs/model/tileset.json",{modelMatrix:computeModelMatrix(),maximumScreenSpaceError: 1,}).then((tileset) => {CesiumViewer.scene.primitives.add(tileset);setupCamera();});} catch (error) {console.error(`Error creating tileset: ${error}`);}
}

下一步工作

性能优化

  • 支持LOD 。
  • 支持多线程、多任务,分批处理 。
  • 切片方案优化,尝试构建其他空间索引,例如八叉树 。

渲染效果调优

目前渲染效果不理想,椭圆的某个轴长过大,问题排查中。

其他

其他待优化项。本文输出的是一个简易版的splat转3dtiles工具,供学习和交流使用,待优化的地方,若有精力后续会持续完善。

参考资料:
[1] https://github.com/KhronosGroup/glTF-Tutorials/tree/main/gltfTutorial
[2] https://github.com/CesiumGS/3d-tiles
[3] https://github.com/CesiumGS/glTF/tree/proposal-KHR_gaussian_splatting/extensions/2.0/Khronos/KHR_gaussian_splatting
[4] https://github.com/CesiumGS/cesium/tree/splat-shader

相关文章:

点云数据处理--splat转3dtiles

文章目录 处理流程简介核心功能实现数据读取与格式转换数据读取splat转gltf 点云数据分割定义四叉树递归生成3dtiles瓦片 生成tileset.json递归生成tileset.json计算box 主函数调用渲染 下一步工作性能优化渲染效果调优其他 源码地址&#xff1a; github 处理流程简介 基本流…...

deepseek使用记录18——艺术的追问

一 好的&#xff0c;基于前面学习结果&#xff0c;再写一篇有艺术美的文章 《美的起义》 凌晨四点的茶摊在电子支付二维码下苏醒&#xff0c;蒸腾的水汽中浮动着八百年前建盏的釉色。老板娘把栀子花插在共享单车车筐里&#xff0c;花瓣的弧度与北宋汝窑青瓷的冰裂纹暗合&…...

ArcGIS操作:13 生成最小外接矩阵

应用情景&#xff1a;筛选出屋面是否能放下12*60m的长方形&#xff0c;作为起降场候选点&#xff08;一个不规则的形状内&#xff0c;判断是否能放下指定长宽的长方形&#xff09; 1、面积初步筛选 Area ≥ 720 ㎡ 面积计算见 2、打开 ArcToolbox → Data Management Tools …...

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么&#xff1f; 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在&#xff1f; 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…...

npm 执行安装报错

Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. 原因​ 主要的原因是 npm7 以上的版本&#xff0c;新增了一个对等依赖的特性&#xff0c;在以…...

Django 模型的逆向工程

模型的逆向工程&#xff1a;通过 inspectdb 命令从数据库表创建 Django 模型 在Django开发中&#xff0c;模型&#xff08;Model&#xff09;是定义数据库结构的关键组件。通常&#xff0c;我们根据业务需求先设计模型&#xff0c;然后通过Django的迁移系统创建相应的数据库表…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...

Electron:点击右键保存图片到本地

前期插件 前端请求后台的一种方法 npm install got -S用于获取ArrayBuffer文件类型 npm install image-type -S生成随机数 npm install randomstring -D增加右击事件 点击右击事件的时候加载菜单 const imageRightSave require("./ImageRightSave") // 创建右…...

C语言中0UL和1UL

0UL 表示 无符号长整型 0 1UL 表示 无符号长整型 1 如果不写UL后缀&#xff0c;系统默认为&#xff1a;int, 即&#xff0c;有符号整数。 数值常数分为&#xff1a;整型常数和浮点常数&#xff1b; 数值常数后缀不区分字母大小写&#xff1b; 1.整型常数的后缀&#xff1a…...

6. 机器人实现远程遥控(具身智能机器人套件)

1. 启动控制脚本 远程作到 Raspberry Pi 中&#xff0c;并运行以下脚本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登录笔记本电脑上&#xff0c;同时运行以下脚本&#xff1a; conda ac…...

C++ 学生成绩管理系统

一、项目背景与核心需求 成绩管理系统是高校教学管理的重要工具,本系统采用C++面向对象编程实现,主要功能模块包括: 学生信息管理(学号/姓名/3门课程成绩) 成绩增删改查(CRUD)操作 数据持久化存储 统计分析与报表生成 用户友好交互界面 二、系统架构设计 1. 类结构设计 …...

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全&#xff1a;Cyber Security&#xff08;网络空间安全&#xff09; 网络空间有独立且相互依存的信息基础设施和网络组成&#xff0c;包括互联网、电信网、计算机系统、嵌入式处理器和控…...

Facebook营销自动化—— Python脚本 + 代理IP实现内容高效分发

目录 1. 引言&#xff1a;内容分发与Facebook营销的现状与痛点 2. 环境搭建与前期准备 2.1 开发环境与工具选择 2.2 获取代理IP 2.3 Facebook账号与开发者平台配置 3. Facebook内容分发的基本流程与策略 3.1 内容规划与策略制定 3.2 内容分发方式选择 3.3 风控与风险防…...

Centos的ElasticSearch安装教程

由于我们是用于校园学习&#xff0c;所以最好是关闭防火墙 systemctl stop firewalld systemctl disable firewalld 个人喜欢安装在opt临时目录&#xff0c;大家可以随意 在opt目录下创建一个es-standonely-docker目录 mkdir es-standonely-docker 进入目录编辑yml文件 se…...

香港地区上线独立多用户电商平台系统需要注意哪些问题

在香港地区上线独立多用户电商平台系统时&#xff0c;需结合本地化需求、技术架构、法律合规及用户体验等多方面因素&#xff0c;以下是需要注意的关键问题及建议&#xff1a; 一、技术架构与服务器部署 服务器配置与带宽选择 根据业务规模选择合适的香港服务器配置&#xff0…...

元宇宙展厅应用场景有哪些?

元宇宙展厅作为元宇宙技术的重要应用场景之一&#xff0c;正在彻底改变人们的展示、学习与交流方式。其应用场景主要包括以下几个方面&#xff1a; 一、企业展览与营销 产品展示&#xff1a;企业可以利用元宇宙展厅搭建虚拟展示空间&#xff0c;通过高精度的3D建模和虚拟现实技…...

XGBoost常见面试题(五)——模型对比

XGBoost与GBDT的区别 机器学习算法中 GBDT 和 XGBOOST 的区别有哪些&#xff1f; - 知乎 基分类器&#xff1a;传统GBDT以CART树作为基分类器&#xff0c;xgboost还支持线性分类器&#xff0c;这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归&#xff08;分类问题&#…...

如何在WPS中接入DeepSeek并使用OfficeAI助手(超细!成功版本)

目录 第一步&#xff1a;下载并安装OfficeAI助手 第二步&#xff1a;申请API Key 第三步:两种方式导入WPS 第一种:本地大模型Ollama 第二种APIKey接入 第四步&#xff1a;探索OfficeAI的创作功能 工作进展汇报 PPT大纲设计 第五步&#xff1a;我的使用体验(体验建议) …...

重学 Android 自定义 View 系列(十一):文字跑马灯剖析

前言 一个可以横向滚动和纵向滚动的自定义文字跑马灯View&#xff0c;支持水平和垂直滚动、多段文本展示、点击事件回调等功能。 该View 由 ScrollTextView&#xff0c;改版而来&#xff0c;效果如下&#xff1a; 1. 功能介绍 ScrollTextView 是基于 SurfaceView 的自定义视…...

Android硬件加速原理解析

Android硬件加速原理解析 一、核心思想 ‌GPU与CPU分工‌ 硬件加速的本质是将‌图形渲染任务从CPU转移到GPU‌,利用GPU的并行计算能力处理像素填充、矩阵变换等密集型图形操作‌12。CPU负责逻辑计算,GPU专注于图形处理,避免单一资源瓶颈‌57。 ‌图形计算优化‌ GPU通过‌专…...

Oracle SQL优化实战要点解析(11)——索引、相关子查询及NL操作(1)

11.1. 充分利用索引有序特性,避免发生大表上的FTS,以及对中间大数据集的排序。 11.1.1. 适用场景 从一个或多个大表(例如:亿行级或TB级数据量)中过滤出全列大数据集(例如:数百万或千万行数据),对该大数据集按其中某列进行排序,最终,只取最前面的少部分数据(例如:…...

题解:AT_past202109_h 最短経路

思路 这一眼就是最短路的题目啊。 为什么不用 Dijkstra 用 死了的 SPFA。因为好写 。 这一题的数据比较小。可以暴力枚举最短路的起点&#xff0c;跑 SPFA&#xff0c;找到符合的直接输出&#xff0c;结束程序。随机数据下 SPFA 平均的时间复杂度为 O ( k n ) O(kn) O(kn)…...

JavaScript基础-算数运算符

在JavaScript编程中&#xff0c;算术运算符是构建程序逻辑的基础工具之一&#xff0c;它们用于执行基本的数学运算&#xff0c;如加法、减法、乘法和除法等。掌握这些运算符不仅有助于进行数值计算&#xff0c;也是编写复杂逻辑的前提条件。本文将详细介绍JavaScript中的各种算…...

Doris vs ClickHouse 企业级实时分析引擎怎么选?

Apache Doris 与 ClickHouse 同作为OLAP领域的佼佼者&#xff0c;在企业级实时分析引擎该如何选择呢。本文将详细介绍 Doris 的优势&#xff0c;并通过直观对比展示两者的关键差异&#xff0c;同时分享一个企业成功用 Doris 替换 ClickHouse 的实践案例&#xff0c;帮助您做出明…...

flask学习3-深入

flask学习-深入 flask学习-深入1. 应用程序结构和生命周期 — Flask 文档 (3.1.x)2.应用程序上下文 — Flask 文档 (3.1.x)3. 请求上下文 — Flask 文档 (3.1.x)上下文的生命周期手动推送上下文关于代理的注意事项4.使用蓝图的模块化应用程序 — Flask 文档 (3.1.x)5.扩…...

任务10:三层交换机配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI&#xff08;开放系统互连&#xff09;模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能&#xff0c;还能实现路由功能&#xff0c;提供更为灵活的网…...

XSD 对 XML 数据格式验证 java

xsd文件&#xff0c;文件名bean.xsd&#xff0c;放在当前java文件目录下 <?xml version"1.0" encoding"UTF-8"?> <xs:schema xmlns:xs"http://www.w3.org/2001/XMLSchema"><xs:element name"bean"><xs:comple…...

深度学习笔记——神经网络

本文为在拓尔思智能举办的训练营中学习内容的总结&#xff0c;部分内容摘自百度百科 个人在这里推荐一个好用的软件&#xff0c;Trae&#xff0c;主要是免费。 人工神经元是人工神经网络的基本单元。模拟生物神经元&#xff0c;人工神经元有1个或者多个输入&#xff08;模拟多…...

大语言模型学习--向量数据库

向量数据库 向量 向量是多维数据空间中的一个坐标点。 向量类型 图像向量 文本向量 语音向量 Embedding 非结构化数据转换为向量过程 通过深度学习训练&#xff0c;将真实世界离散数据&#xff0c;投影到高维数据空间上&#xff0c;通过数据在空间中间的距离体现真实世界…...

蓝桥杯 封闭图形个数

蓝桥杯 封闭图形个数 题目 链接 解答 # 数字个数 n int(input()) # 数字 ls input().split() # 统计数字的圈数 o_nums {} for i, x in enumerate(ls):o_num 0for c in x:if int(c) in [0, 4, 6, 9]:o_num 1elif c 8:o_num 2o_nums[i] o_num # 字典根据圆圈数排序 …...

c++快速入门-2

算数运算符 赋值运算符“” 赋值运算符概念 将一个值赋给一个变量。 例&#xff1a;a3&#xff1b;//将3这个值赋给a 赋值是从右向左&#xff0c;都是赋值表达式。 错误示范&#xff1a;3a&#xff1b;//不符合从右向左 b-25&#xff1b;//“”左边只能有一个变量名&…...

URL中的特殊字符与web安全

在现代Web应用中&#xff0c;URL作为客户端与服务器之间的通信桥梁&#xff0c;承载着大量的重要信息。URL中的特殊字符&#xff0c;看似只是一些常见的符号&#xff0c;但在Web安全领域&#xff0c;它们与其他安全知识密切相关&#xff0c;如在Base64编码、SQL注入&#xff0c…...

Python ❀ Unix时间戳转日期或日期转时间戳工具分享

设计一款Unix时间戳和日期转换工具&#xff0c;其代码如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 转时间戳def datetime2timestamp(s…...

H.264,H.265,H.266标准技术改进

关于H.264,H.265,H.266相关资料链接&#xff1a; 标准及中文资料链接 视频编码中的主要技术 视频编码的目标是在保证视频质量的前提下&#xff0c;尽可能减少数据量。以下是视频编码中的核心技术&#xff1a; 块划分&#xff08;Block Partitioning&#xff09; 将视频帧划分…...

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取 在当今人工智能时代&#xff0c;网络爬虫扮演着至关重要的角色。它们不仅是数据收集的强大工具&#xff0c;更是驱动机器学习、自然语言处理等技术发展的关键引擎。 然而&#xff0c;对于用户来说&#xff0c;在面对复杂多…...

C++ primer plus 第七节 函数探幽完结版

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …...

linux | Vim 命令快捷操作

注&#xff1a;本文为过去的 “vim 使用笔记”。 跳转命令 跳转命令 #&#xff1a;向前查找光标当前所在单词&#xff0c;并跳转到该单词的上一个出现位置。*&#xff1a;向后查找光标当前所在单词&#xff0c;并跳转到该单词的下一个出现位置。 行内跳转 0&#xff1a;跳转…...

RuleOS:区块链开发的“新引擎”,点燃Web3创新之火

RuleOS&#xff1a;区块链开发的“新引擎”&#xff0c;点燃Web3创新之火 在区块链技术的浪潮中&#xff0c;RuleOS宛如一台强劲的“新引擎”&#xff0c;为个人和企业开发去中心化应用&#xff08;DApp&#xff09;注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…...

梯度本质论:从黎曼流形到神经网络的拓扑寻优

一、微分几何框架下的梯度再诠释 在标准数学分析中&#xff0c;梯度被定义为标量场 f : R n → R f:\mathbb{R}^n→\mathbb{R} f:Rn→R的导数张量 ∇ f ( ∂ f ∂ x 1 , . . . , ∂ f ∂ x n ) \nabla f(\frac{\partial f}{\partial x_1},...,\frac{\partial f}{\partial x_n…...

LVGL直接解码png图片的方法

通过把png文件解码为.C文件&#xff0c;再放到工程中的供使用&#xff0c;这种方式随时速度快&#xff08;应为已经解码&#xff0c;代码中只要直接加载图片数据显示出来即可&#xff09;&#xff0c;但是不够灵活&#xff0c;适用于哪些简单又不经常需要更换UI的场景下使用。如…...

代码随想录算法营Day59 | 寻找存在的路径, 冗余连接,冗余连接II

寻找存在的路径 这题使用并查集即可。并查集加路径压缩。 #include <iostream> using namespace std; int find(int* father,int u){return father[u] u ? u : father[u] find(father,father[u]); }bool isSame(int* father,int u,int v){return find(father,u) fi…...

物联网智慧农业一体化解决方案-可继续扩展更多使用场景

在智慧农业中,从种子、施肥、灌溉、锄地、农具管理、日常照料到蔬菜档案管理,以及与客户、供应商、市场的对接,可以通过物联网(IoT)、大数据、人工智能(AI)、区块链和云计算等技术,构建一个从生产到销售的全流程数字化、智能化农业生态系统。以下是实现方案和技术路径的…...

第八节:基于Winform框架的串口助手小项目---完结优化《C#编程》

C# 实战串口助手完成&#xff01; ----------------------------不竭余力&#xff0c;方能成长&#xff01;-----------WHAPPY 源码&#xff1a;我会分享开源平台&#xff0c;可以艾特me&#xff01;&#xff08;2025/3/5&#xff09;时间紧张任务中&#xff01; 文章上所说的…...

Python已知后序遍历和中序遍历,求先序遍历

步骤一&#xff1a;树的构建 字典 def createTree(arr1,arr2,tree):if len(arr1)0 and len(arr2)0 :returnroot len(arr1)-1# print(arr1[root],root)flag arr2.index(arr1[root])# print(flag)len_right len(arr2)-flag-1len_left flagif len(arr2[:flag])>1:lchild …...

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…...

基于uniapp的蓝牙打印功能(佳博打印机已测试)

相关步骤 1.蓝牙打印与低功耗打印的区别2.蓝牙打印流程2.1 搜索蓝牙2.2 连接蓝牙 3.连接蓝牙设备4.获取服务5.写入命令源码gbk.jsglobalindex.ts 1.蓝牙打印与低功耗打印的区别 低功耗蓝牙是一种无线、低功耗个人局域网&#xff0c;运行在 2.4 GHz ISM 频段 1、低功耗蓝牙能够…...

基于Django的协同过滤算法养老新闻推荐系统的设计与实现

基于Django的协同过滤算法养老新闻推荐系统&#xff08;可改成普通新闻推荐系统使用&#xff09; 开发工具和实现技术 Pycharm&#xff0c;Python&#xff0c;Django框架&#xff0c;mysql8&#xff0c;navicat数据库管理工具&#xff0c;vue&#xff0c;spider爬虫&#xff0…...

PROFINET转PROFIBUS从案例剖析网关模块的协议转换功能

一、 案例背景 在当下追求高效协同的工业自动化生产体系里&#xff0c;设备间的无缝互联互通堪称关键要素。某企业的生产车间中&#xff0c;有一台性能稳定的变频器&#xff0c;其配备的是PROFIBUS接口。与此同时&#xff0c;操控整个生产线的核心大脑——西门子1500 PLC&…...

BZOJ2121 字符串游戏

想出来了一半&#xff0c;然后看了眼题解&#xff0c;果然还是和状压不熟导致的。 题目大意 给你一个字符串 L L L 和一个有 n n n 个字符串的集合 S S S&#xff0c;每次操作可以在 L L L 中选择一个子串&#xff0c;如果这个子串在集合 S S S 中&#xff0c;那么这个子…...

计算机组成原理:计算机系统的性能指标

文章目录 什么是计算机系统的性能指标硬件与计算机系统性能的关系软件与计算机系统性的关系计算机硬件的相关性能指标基本性能指标机器字长数据通路带宽主存容量吞吐量响应时间 与运算速度相关的性能指标CPU时钟频率和时钟周期CPICPU执行时间IPCMIPSMFLOPS 使用基准程序进行性能…...