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

open3d教程 (三)点云的显示

官方文档位置: Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法:

o3d.visualization.draw_geometries([几何对象列表])
import  open3d as o3dprint("Load a ply point cloud, print it, and render it")
sample_ply_data = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(sample_ply_data.path)
o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

visualization窗体功能:

点击到窗口  按键盘 h 键

(1) 视图控制

操作

方法
旋转视图按住鼠标左键拖动
平移视图按住鼠标滚轮拖动
缩放视图鼠标滚轮
重置视角按 R 键
切换全屏按 F 键
快捷键功能
L切换点云渲染(点/线框/面)
N显示/隐藏法线(需提前计算)
C显示/隐藏颜色(如果数据包含颜色)
S保存当前视角截图

添加几何元素 

下面的代码使用 、 和 生成一个长方体、一个球体和一个圆柱体。长方体涂成红色,球体涂成蓝色,圆柱体涂成绿色。为所有网格计算法线以支持 Phong 着色(请参见可视化 3D 网格和表面法线估计)。我们甚至可以使用 创建一个坐标轴,其原点设置为 (-2, -2, -2)。

import  open3d as o3d
print("Let's define some primitives")
#创建立方体
mesh_box = o3d.geometry.TriangleMesh.create_box(width=1.0,height=1.0,depth=1.0)
#设置颜色
mesh_box.paint_uniform_color([0.9, 0.1, 0.1]) 
#创建球体
mesh_sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1.0)
#设置颜色
mesh_sphere.paint_uniform_color([0.1, 0.1, 0.7])
#创建圆柱体
mesh_cylinder = o3d.geometry.TriangleMesh.create_cylinder(radius=0.3,height=4.0)
mesh_cylinder.paint_uniform_color([0.1, 0.9, 0.1])
#创建坐标轴
mesh_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.6, origin=[-2, -2, -2])
print("We draw a few primitives using collection.")
o3d.visualization.draw_geometries([mesh_box, mesh_sphere, mesh_cylinder, mesh_frame])print("We draw a few primitives using + operator of mesh.")
o3d.visualization.draw_geometries([mesh_box + mesh_sphere + mesh_cylinder + mesh_frame])

绘制线 

Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html#Draw-line-set

import open3d as o3d
print("Let's draw a box using o3d.geometry.LineSet.")
# 点坐标
points = [[0, 0, 0],[1, 0, 0],[0, 1, 0],[1, 1, 0],[0, 0, 1],[1, 0, 1],[0, 1, 1],[1, 1, 1],
]
# 线段索引  [0, 1] 表示0号点到1号点的线段
lines = [[0, 1],[0, 2],[1, 3],[2, 3],[4, 5],[4, 6],[5, 7],[6, 7],[0, 4],[1, 5],[2, 6],[3, 7],
]
colors = [[1, 0, 0] for i in range(len(lines))]
line_set = o3d.geometry.LineSet(points=o3d.utility.Vector3dVector(points), # 点坐标 需要转换为Vector3dVector  Vector3dVector 是一个关键的数据转换工具,# 用于将常见的数值数组(如 NumPy 数组或 Python 列表)转换为 Open3D 内部高效处理的 3D 向量格式 N×3lines=o3d.utility.Vector2iVector(lines),
)
line_set.colors = o3d.utility.Vector3dVector(colors)
o3d.visualization.draw_geometries([line_set])

Vector2iVector 是一个用于处理 二维整数向量数据 的实用工具类,类似于 Vector3dVector,但专为 (N, 2) 形状的整数数据设计

Vector3dVector 是一个关键的数据转换工具,用于将常见的数值数组(如 NumPy 数组或 Python 列表)转换为 Open3D 内部高效处理的 3D 向量格式,主要功能:将 N×3 的数值数据(如点云坐标、法线、颜色)转换为 Open3D 几何体(如 PointCloudTriangleMesh)可识别的内部数据结构

自定义可视化  自定义创建功能

 

Customized visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/customized_visualization.html#customized-visualization使点云旋转

import  open3d as o3d
def custom_draw_geometry_with_rotation(pcd):def rotate_view(vis):ctr = vis.get_view_control()ctr.rotate(10.0, 0.0)return Falseo3d.visualization.draw_geometries_with_animation_callback([pcd],rotate_view)sample_pcd_data = o3d.data.PCDPointCloud()
pcd = o3d.io.read_point_cloud(sample_pcd_data.path)
custom_draw_geometry_with_rotation(pcd)

https://www.open3d.org/docs/release/_images/rotate_small.gif

交互式可视化

Interactive visualization - Open3D 0.19.0 documentation

  

# examples/python/visualization/interactive_visualization.pyimport numpy as np
import copy
import open3d as o3ddef demo_crop_geometry():print("Demo for manual geometry cropping")print("1) Press 'Y' twice to align geometry with negative direction of y-axis")print("2) Press 'K' to lock screen and to switch to selection mode")print("3) Drag for rectangle selection,")print("   or use ctrl + left click for polygon selection")print("4) Press 'C' to get a selected geometry")print("5) Press 'S' to save the selected geometry")print("6) Press 'F' to switch to freeview mode")pcd_data = o3d.data.DemoICPPointClouds()pcd = o3d.io.read_point_cloud(pcd_data.paths[0])o3d.visualization.draw_geometries_with_editing([pcd])def draw_registration_result(source, target, transformation):source_temp = copy.deepcopy(source)target_temp = copy.deepcopy(target)source_temp.paint_uniform_color([1, 0.706, 0])target_temp.paint_uniform_color([0, 0.651, 0.929])source_temp.transform(transformation)o3d.visualization.draw_geometries([source_temp, target_temp])def prepare_data():pcd_data = o3d.data.DemoICPPointClouds()source = o3d.io.read_point_cloud(pcd_data.paths[0])target = o3d.io.read_point_cloud(pcd_data.paths[2])print("Visualization of two point clouds before manual alignment")draw_registration_result(source, target, np.identity(4))return source, targetdef pick_points(pcd):print("")print("1) Please pick at least three correspondences using [shift + left click]")print("   Press [shift + right click] to undo point picking")print("2) After picking points, press 'Q' to close the window")vis = o3d.visualization.VisualizerWithEditing()vis.create_window()vis.add_geometry(pcd)vis.run()  # user picks pointsvis.destroy_window()print("")return vis.get_picked_points()def register_via_correspondences(source, target, source_points, target_points):corr = np.zeros((len(source_points), 2))corr[:, 0] = source_pointscorr[:, 1] = target_points# estimate rough transformation using correspondencesprint("Compute a rough transform using the correspondences given by user")p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()trans_init = p2p.compute_transformation(source, target,o3d.utility.Vector2iVector(corr))# point-to-point ICP for refinementprint("Perform point-to-point ICP refinement")threshold = 0.03  # 3cm distance thresholdreg_p2p = o3d.pipelines.registration.registration_icp(source, target, threshold, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPoint())draw_registration_result(source, target, reg_p2p.transformation)def demo_manual_registration():print("Demo for manual ICP")source, target = prepare_data()# pick points from two point clouds and builds correspondencessource_points = pick_points(source)target_points = pick_points(target)assert (len(source_points) >= 3 and len(target_points) >= 3)assert (len(source_points) == len(target_points))register_via_correspondences(source, target, source_points, target_points)print("")if __name__ == "__main__":demo_crop_geometry()demo_manual_registration()

draw_geometries_with_editing 默认绑定的功能 可以实现点云的剪切

以下是打印信息中提到的按键及其作用:

按键

功能触发条件
Y (按两次)将几何体对齐到 Y 轴负方向必须在非锁定模式下
K锁定屏幕并进入选择模式任意时刻
Ctrl + 左键多边形选择模式必须在选择模式下
拖动鼠标矩形框选必须在选择模式下
C提取选中区域的几何体必须在选择模式下有选中区域
S保存当前几何体到 edited_model.ply任意时刻
F退出选择模式,返回自由视角必须在选择模式下

自定义按键绑定(高级用法)
如果需要覆盖默认行为或添加新功能,可以通过 注册回调函数 实现:


def custom_key_callback(vis):print("Custom key pressed!")return Falsevis = o3d.visualization.VisualizerWithEditing()
vis.create_window()
vis.register_key_callback(ord("Q"), custom_key_callback)  # 绑定Q键
vis.add_geometry(pcd)
vis.run()

Interactive visualization - Open3D 0.19.0 documentation

实现手动选点 

核心代码
def pick_points(pcd):print("")print("1) Please pick at least three correspondences using [shift + left click]")print("   Press [shift + right click] to undo point picking")print("2) After picking points, press 'Q' to close the window")vis = o3d.visualization.VisualizerWithEditing()vis.create_window()vis.add_geometry(pcd)vis.run()  # user picks pointsvis.destroy_window()print("")return vis.get_picked_points()

进行点云配准

def register_via_correspondences(source, target, source_points, target_points):"""通过用户提供的对应点对进行点云粗配准 + ICP精配准参数:source (open3d.geometry.PointCloud): 待配准的源点云target (open3d.geometry.PointCloud): 目标点云source_points (list/np.array): 源点云中选取的对应点索引数组target_points (list/np.array): 目标点云中对应的点索引数组"""# 1. 构建对应点对矩阵 (N x 2)corr = np.zeros((len(source_points), 2))  # 初始化对应点对容器corr[:, 0] = source_points  # 第一列填充源点云索引corr[:, 1] = target_points  # 第二列填充目标点云索引# 2. 基于对应点对计算初始变换矩阵print("Compute a rough transform using the correspondences given by user")# 创建点对点变换估计器p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()# 计算初始变换矩阵(将source_points对齐到target_points)trans_init = p2p.compute_transformation(source, target,o3d.utility.Vector2iVector(corr)  # 将对应点对转换为Open3D格式)# 3. 使用ICP进行精细配准print("Perform point-to-point ICP refinement")threshold = 0.03  # 3cm距离阈值,超过此距离的点对不参与计算reg_p2p = o3d.pipelines.registration.registration_icp(source,               # 源点云target,               # 目标点云threshold,            # 最大对应点距离阈值trans_init,           # 上一步计算的初始变换o3d.pipelines.registration.TransformationEstimationPointToPoint(),  # 使用点对点ICP# 可选参数(未显式设置时使用默认值):# criteria = ICP迭代停止条件(默认最大迭代30次,相对变化1e-6)# estimation_method = 变换估计方法)# 4. 可视化配准结果draw_registration_result(source, target, reg_p2p.transformation)# 返回配准结果(包含变换矩阵、拟合度等信息)return reg_p2p

典型使用场景:

# 示例:手动选取5对对应点进行配准
source_idx = [10, 20, 30, 40, 50]  # 源点云中选取的点索引
target_idx = [15, 25, 35, 45, 55]  # 目标点云中对应的点索引
result = register_via_correspondences(source_pcd, target_pcd, source_idx, target_idx)
print("Final transformation matrix:\n", result.transformation)

非阻塞窗口  不停止窗口  并更新窗口显示


import open3d as o3d
import numpy as npdef prepare_data():# 加载Open3D提供的示例点云数据(两帧扫描数据)pcd_data = o3d.data.DemoICPPointClouds()source_raw = o3d.io.read_point_cloud(pcd_data.paths[0])  # 源点云target_raw = o3d.io.read_point_cloud(pcd_data.paths[1])  # 目标点云# 体素下采样(降低计算量)source = source_raw.voxel_down_sample(voxel_size=0.02)target = target_raw.voxel_down_sample(voxel_size=0.02)# 对源点云施加初始变换(模拟初始位姿偏差)trans = [[0.862, 0.011, -0.507, 0.0], [-0.139, 0.967, -0.215, 0.7],[0.487, 0.255, 0.835, -1.4], [0.0, 0.0, 0.0, 1.0]]  # 4x4变换矩阵source.transform(trans)# 对两个点云施加镜像翻转(使可视化效果更直观)flip_transform = [[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]source.transform(flip_transform)target.transform(flip_transform)return source, targetdef demo_non_blocking_visualization():# 设置日志级别为Debug(显示详细运行信息)o3d.utility.set_verbosity_level(o3d.utility.VerbosityLevel.Debug)# 加载数据source, target = prepare_data()# 创建可视化窗口并添加几何体vis = o3d.visualization.Visualizer()vis.create_window()vis.add_geometry(source)  # 添加源点云(红色)vis.add_geometry(target)  # 添加目标点云(蓝色)# ICP参数设置threshold = 0.05  # 距离阈值(5cm内视为对应点)icp_iteration = 100  # 总迭代次数save_image = False  # 是否保存每帧截图# 迭代执行ICPfor i in range(icp_iteration):# 执行单次ICP迭代(max_iteration=1表示每步只迭代一次)reg_p2l = o3d.pipelines.registration.registration_icp(source, target, threshold, np.identity(4),o3d.pipelines.registration.TransformationEstimationPointToPlane(),o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=1))# 更新源点云位置source.transform(reg_p2l.transformation)# 刷新可视化vis.update_geometry(source)  # 通知可视化器几何体已更新vis.poll_events()  # 处理UI事件(如窗口缩放)vis.update_renderer()  # 重绘场景# 可选:保存当前帧截图if save_image:vis.capture_screen_image("temp_%04d.jpg" % i)# 关闭窗口vis.destroy_window()o3d.utility.set_verbosity_level(o3d.utility.VerbosityLevel.Info)  # 恢复日志级别if __name__ == '__main__':demo_non_blocking_visualization()

关键点

  • 非阻塞可视化三要素

    • update_geometry():标记需要更新的几何体

    • poll_events():处理用户交互事件

    • update_renderer():触发画面重绘

  • ICP配置

    • TransformationEstimationPointToPlane:使用点到面ICP(比点到点更鲁棒)

    • max_iteration=1:每次外部循环只做一次ICP迭代,实现逐步可视化

此脚本调用每次迭代。请注意,它通过 .这是从单个 ICP 迭代中检索轻微姿势更新的技巧。在 ICP 之后,源几何体会相应地变换。registration_icpICPConvergenceCriteria(max_iteration = 1)

相关文章:

open3d教程 (三)点云的显示

官方文档位置: Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法: o3d.visualization.draw_geometries([几何对象列表]) import open3d as o3dprint("Load …...

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境,主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务,突破了 JavaScript 仅在浏览器中运行的限制。 npm(Node Package Man…...

大象如何学会太空漫步?美的:科技领先、To B和全球化

中国企业正处在转型的十字路口。一边是全新的技术、全新的市场机遇;一边是转型要面临的沉重负累和巨大投入,无数中国制造、中国品牌仍在寻路,而有的人已经走至半途。 近日,美的集团交出了一份十分亮眼的2024年财报。数据显示&…...

Go红队开发— 收官工具

文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 💡 本博客绝不涉及任何非法用途。 💡 使用者风险自担,违规后果自负。 💡 守法为先,技术向善。 …...

Android 应用程序包的 adb 命令

查看所有已安装应用的包名 命令:adb shell pm list packages说明:该命令会列出设备上所有已安装应用的包名。可以通过管道符|结合grep命令来过滤特定的包名,例如adb shell pm list packages | grep com.pm,这将只显示包名中包含co…...

北京南文观点:后糖酒会营销,以战略传播重构品牌信心坐标

第112届全国糖酒会落下帷幕,参展品牌面临一个关键命题。如何在流量洪流中沉淀品牌价值?北京南文(全称:南文乐园科技文化(北京)有限公司)认为,糖酒会的结束恰是算法时代品牌认知战的真…...

Qt - findChild

findChild 1. 函数原型2. 功能描述3. 使用场景4. 示例代码5. 注意事项6. 总结 在 Qt 中,每个 QObject 都可以拥有子对象,而 QObject 提供的模板函数 findChild 就是用来在对象树中查找满足特定条件的子对象的工具。下面我们详细介绍一下它的使用和注意事…...

2025年3月个人工作生活总结

本文为 2025年3月工作生活总结。 研发编码 一个curl下载失败问题的记录 问题: 某程序,指定IP和账户密码配置,再使用curl库连接sftp服务器,下载文件。在CentOS系统正常,但在某国产操作系统中失败,需要用命…...

Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析

Spring Boot 七种事务传播行为支持部分回滚的分析 支持部分回滚的传播行为 REQUIRES_NEW:始终开启新事务,独立于外部事务,失败时仅自身回滚。NESTED:在当前事务中创建保存点(Savepoint),可局部…...

NVIDIA工业设施数字孪生中的机器人模拟

工业设施数字孪生中的机器人模拟 文章目录 工业设施数字孪生中的机器人模拟数字孪生技术的价值NVIDIA Omniverse平台工业机器人仿真的核心组件示例一:使用Isaac Sim创建基本机器人场景示例二:机器人运动规划和轨迹执行示例三:传感器集成与感知…...

docker安装jenkins

docker安装jenkins 1.安装javaJDK 服务器安装javaJDK ,因为我的服务器是直接集成了宝塔面板,我就直接从宝塔面板去安装JDK 最好安装17的JDK,因为后面会安装jenkins,需要17的版本 1.2查看安装是否完成 java --version 安装成功如下&#x…...

量子计算与人工智能融合的未来趋势

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。 在当今科技飞速发展…...

人工智能在生物医药-新版ChatGPT-4o辅助一键生成机制图

新版ChatGPT-4o辅助一键生成机制图 作为一位生物医学教授专家,我将基于PubMed最新研究和科研大数据信息,遵循您的要求,一步一步进行思考和预测。 核心问题:乳酸化修饰促进肾透明细胞癌(ccRCC)恶性进展的机…...

支持 MCP 协议的开源 AI Agent 项目

关键要点 研究表明,目前有多个开源 AI Agent 项目支持 MCP 协议,包括 ChatMCP、HyperChat、5ire 和 Cherry Studio 等。这些项目主要用于聊天或桌面助手,允许通过 MCP 协议连接外部数据和工具。MCP 协议是 2024 年 11 月由 Anthropic 开源的…...

JavaRedis和数据库相关面试题

JavaRedis面试题 1. Redis是什么以及Redis为什么快? ​ Redis(Remote Dictionary Server)是一个开源的内存键值数据库,支持多种数据结构(如字符串、哈希、列表、集合等),并提供持久化、复制、…...

Android开发RxJava3延迟操作

Android开发RxJava3延迟操作 直接上代码: /*** param timeMillis 毫秒单位* desc : 延迟多少毫秒操作,* 注:它和Activity生命周期绑定,界面关闭了不会再执行delayTodoListener.delayTodo()* author : congge on 2021-03-25 15:31**/p…...

android 设置状态栏背景

一 让activity ui界面和手机状态栏一样的背景 要让 Activity 的 UI 界面和手机状态栏具有相同的背景颜色,并且能够随着深色模式和非深色模式的切换而改变颜色,你可以按照以下步骤操作: 1. 让 Activity 和 状态栏背景颜色一致 使用 window.s…...

vue 常见优化手段

文章目录 vue常见的优化手段前言使用key(避免明明相同的dom,每次更新都要重新生成)使用冻结的对象(避免无意义的响应式数据)使用函数式组件(减少vue组件实例的生成)vue3vue2使用计算属性(减少数据计算的次数)非实时绑定的表单项(避免表单过多触发监听事件)保持对象的…...

vue生命周期、钩子以及跨域问题简介

Vue 的生命周期是指 Vue 实例从创建到销毁的整个过程。在这个过程中,Vue 提供了一系列的生命周期钩子(Lifecycle Hooks),允许开发者在特定的时间点执行代码。以下是 Vue 的生命周期和钩子的简单说明: Vue 的生命周期阶…...

主相机绑定小地图

资源初始化:在类中通过 property 装饰器定义主相机、小地图相机、小地图精灵等资源属性,便于在编辑器中赋值。在 start 方法里,当确认这些资源存在后,创建渲染纹理并设置其大小,将渲染纹理与小地图相机关联&#xff0c…...

关于音频采样率,比特,时间轴的理解

是的,你的理解完全正确!-ar、-af aresampleasync1000 和 -b:a 64k 分别用于控制音频的采样率、时间戳调整和比特率。它们各自有不同的作用,但共同确保音频的质量和同步性。下面我将详细解释每个参数的作用和它们之间的关系。 1. -ar 参数 作用…...

三、FFmpeg学习笔记

​ FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的“瑞士军刀”。 FFmp…...

什么是 Java 泛型

一、什么是 Java 泛型? 泛型(Generics) 是 Java 中一种强大的编程机制,允许在定义类、接口和方法时使用类型参数。通过泛型,可以将数据类型作为参数传递,从而实现代码的通用性和类型安全。 简单来说&…...

从 WPF 到 MAUI:跨平台 UI 开发的进化之路

一、引言 在软件开发领域,用户界面(UI)开发一直是至关重要的环节。随着技术的不断发展,开发者对于创建跨平台、高性能且美观的 UI 需求日益增长。Windows Presentation Foundation(WPF)和 .NET Multi - pl…...

Docker学习之dockerfile篇(day8)

文章目录 前言一、问题描述二、具体内容1. Docker 镜像原理2. Docker 镜像制作3. Dockerfile 概念Dockerfile 的基本结构: 4. Dockerfile 关键字5. Docker 实战案例5.1 基于 Nginx 构建 Web 服务器 6. 验证与总结6.1 验证 Dockerfile6.2 总结 前言 Docker 是一种轻…...

Kotlin 作用域函数:apply、let、run、with、also

在 Kotlin 开发中,作用域函数(Scope Functions)是一组能让代码更简洁、更函数式的高阶函数。它们通过不同的作用域规则和返回值设计,解决了对象配置、空安全处理、链式操作等常见场景问题。本文将结合核心特性、代码示例和对比表格…...

Java 线程池与 Kotlin 协程 高阶学习

以下是Java 线程池与 Kotlin 协程 高阶学习的对比指南,结合具体代码示例,展示两者在异步任务处理中的差异和 Kotlin 的简化优势: 分析: 首先,我们需要回忆Java中线程池的常见用法,比如通过ExecutorService创…...

C++学习笔记(三十三)——forward_list

一、std::forward_list (1) forward_list与其适用场景 std::forward_list 是 C的STL中的单向链表(Singly Linked List),它相比 std::list(双向链表)更轻量,适用于仅需要单向遍历的场景。 主要特点&#…...

ROS订阅相机图像识别颜色并发布识别信息

一、前言 区别于之前的直接驱动相机,这里改为读取图像话题进行处理,原因是如果opencv驱动相机后只能单一使用,就限制了其他识别功能(除非将原始图像发布出来),所以这里改成可以读取任意相机图像话题的方法…...

Redis-15.在Java中操作Redis-Spring Data Redis使用方式-操作集合类型的数据

一.操作集合类型的数据 package com.sky.test;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;import j…...

第十一届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

1.字串排序 不会做&#xff0c;感觉挺难的&#xff0c;有兴趣的可以看下面题解 #include <iostream> #include <string.h> using namespace std; int V; int len;//符合交换次数V&#xff0c;字符串长度最小值 int now; //当前已经构造好的那一部分字符串逆序对个数…...

CentOS 安装 zip

安装软件 sudo yum install zip unzip # CentOS 7 sudo dnf install zip unzip # CentOS 8/9压缩文件 # 压缩单个文件 zip 压缩包名.zip 文件1# 压缩多个文件 zip 压缩包名.zip 文件1 文件2 文件3# 压缩目录&#xff08;包含子目录&#xff09; zip -r 压缩包名.zip 目…...

FastPillars:一种易于部署的基于支柱的 3D 探测器

FastPillars&#xff1a;一种易于部署的基于支柱的 3D 探测器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…...

LVS高可用负载均衡

一、项目图 二、主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT192.168.72.115/24lvs-masterredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.116/24 VIP 192.168.72.100/32lvs-backupredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.117/24 VIP 192.168…...

Kafka延迟队列实现分级重试

技术方案 方案背景 Kafka队列消息消费处理过程中&#xff0c;发生处理异常&#xff0c;需要实现重试机制&#xff0c;并基于重试次数实现不同延迟时间重试方案。 方案介绍 通过实现Kafka延迟队列来实现消息重试机制。 目标&#xff1a; 支持所有业务场景的延迟重试支持多…...

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…...

3.第二阶段x64游戏实战-分析人物移动实现人物加速

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;2.第二阶段x64游戏实战-x64dbg的使用 想找人物的速度&#xff0c;就需要使用Ch…...

MQTT 服务器(emqx)搭建及使用(一)

一. EMQX 服务器搭建 1.下载EMQX 下载链接&#xff1a;Windows | EMQX 文档 官方手册 2.下载内容解压至盘符根目录 3.进入bin文件夹&#xff0c;在地址栏输入cmd 4.依次输入下面命令安装服务 .\emqx.cmd install .\emqx.cmd console 5.设置自启动 创建批处理文件&#x…...

什么是SSE和websocket

以下是 SSE&#xff08;Server-Sent Events&#xff09; 和 WebSocket 在大模型&#xff08;如 ChatGPT&#xff09;流式输出中的实际例子对比&#xff0c;包含代码实现和场景分析&#xff1a; —### 1. SSE&#xff08;Server-Sent Events&#xff09;#### 场景 大模型生成文本…...

蓝桥杯专项复习——二分查找、二分答案

目录 二分查找、二分答案基础知识 二分查找模版 【模版题】数的范围 借教室 二分查找、二分答案基础知识 二分模版 二分查找 【模版题】数的范围 输入样例 6 3 1 2 2 3 3 4 3 4 5输出样例 3 4 5 5 -1 -1 思路&#xff1a; 对应两个模版&#xff0c;起始位置是对应第一…...

Android学习总结之Kotlin 协程

一、引言 在 Android 开发中&#xff0c;异步任务处理是绕不开的话题。传统的线程、Handler、AsyncTask 等方案要么过于繁琐&#xff0c;要么存在生命周期管理问题。Kotlin 协程的出现&#xff0c;以优雅的语法和强大的结构化并发能力&#xff0c;成为解决异步编程难题的理想方…...

docker的与使用

1 docker初体验 1.1 docker简介 问题&#xff1a;为什么会有docker出现&#xff1f; 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发运维之间的协作我们需要关心很多东西&#xff0c;这也是很多互联网公司都不得不面对…...

解决ubuntu18.04无法进入系统桌面

解决ubuntu18.04无法进入系统桌面 解决ubuntu18.04无法进入系统桌面前言1、原因2、解决现象总结 前言 Vmware虚拟机运行跑Linux项目&#xff0c;没有关掉运行的进程就关机&#xff0c;导致系统无法进入系统桌面&#xff0c;一直卡在系统的初始化界面&#xff0c;按下快捷键发…...

Docker学习之容器虚拟化与虚拟机的区别(day11)

文章目录 前言一、问题描述二、具体内容1. 虚拟机&#xff08;VM&#xff09;2. 容器虚拟化&#xff08;Docker&#xff09;容器虚拟化的核心技术 三、总结1. 资源占用对比2. 适用场景3. 结论 前言 在现代软件开发和部署过程中&#xff0c;Docker 和虚拟机&#xff08;VM&…...

无人机数据链技术及运行方式详解!

一、无人机数据链技术要点 1. 通信传输技术 频段选择&#xff1a; 常用频段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同频段在传输距离、带宽和抗干扰性间权衡。 低…...

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档&#xff1a;MyBatis Plus官方文档…...

设计模式 三、结构型设计模式

一、代理模式 代理设计模式&#xff08;Proxy Design Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供了一个代理&#xff0c;以控制对这个对象的访问。 代理模式可以用于实现懒加载、安全访问控制、日志记录等功能。简单来说&#xff0c;代理模式 就是通…...

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…...

JMeter脚本录制(火狐)

录制前准备&#xff1a; 电脑&#xff1a; 1、将JMeter证书导入&#xff0c;&#xff08;bin目录下有一个证书&#xff0c;需要安装这个证书到电脑中&#xff09; 2、按winr&#xff0c;输入certmgr.msc&#xff0c;打开证书&#xff0c;点击下一步&#xff0c;输入JMeter证书…...

10、Linux C 网络编程(完整版)

1、网络发展历史和分层 1.1 Internet 的历史 起源&#xff1a; 1957 年&#xff1a;苏联发射第一颗人造卫星 "Sputnik"。 1958 年&#xff1a;美国总统艾森豪威尔成立 DARPA&#xff08;国防部高级研究计划署&#xff09;。 1968 年&#xff1a;DARPA 提出 "…...