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

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解

        全景图像到透视图像的转化是一个复杂的图像处理过程,它涉及到将一个360度的全景图像转换为一个具有透视效果的图像,这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像,它通过将球面图像映射到平面上得到,而透视图像则模拟了相机的视角,具有近大远小的特性。在进行转换时,我们首先需要理解全景图像和透视图像的几何关系。全景图像可以看作是一个球面上的图像,而透视图像则是从球面上的某一点向外投影到一个平面上的结果。这个投影过程可以通过数学上的几何变换来实现,涉及到球面坐标和笛卡尔坐标之间的转换。

1.理解全景图像和透视图像

  • 全景图像:通常是指能够捕捉360度环境视角的图像,上下边缘对应天空和地面,左右边缘连续,形成一个完整的视角。
  • 透视图像:更接近于传统相机视角的图像,它模拟了人眼观察世界的方式,具有近大远小的特性。

2. 转换原理

  • 转换过程基于球面和平面之间的几何映射。全景图像可以看作是投影到一个虚拟球面上,然后从球的某一点(虚拟相机的位置)向外投影到一个平面上,从而获得透视图像。

3. 数学模型和算法

  • 球面到平面的投影:通过数学上的几何变换,将全景图像上的点映射到透视图像上。这涉及到球面坐标和笛卡尔坐标之间的转换。
  • 旋转矩阵:在三维空间中,使用旋转矩阵来实现全景图像到透视图像的转换。这包括绕X、Y、Z轴的旋转,以模拟相机的视角变化。

4. Python实现

  • 库的使用:使用OpenCV和NumPy库来处理图像和进行数值计算。
  • 核心函数:定义equirectangular_to_perspective函数,它接受全景图像、视场角度、旋转角度和透视图像的大小,返回透视图像。
  • 旋转函数:定义rotate_3D函数,基于旋转矩阵实现三维空间中的点旋转。

5. 使用OpenCV进行透视变换

  • 获取透视变换矩阵:可以通过求解透视变换公式或使用预先计算的矩阵获得。
  • 设置输出图像大小:根据需要设置输出图像的大小。
  • 调用cv2.warpPerspective()函数:使用提供的参数执行透视变换。

二、现有工作

        在PanFusion这篇论文中,全景分支(Panorama Branch)和透视分支(Perspective Branch)之间的信息传递是通过一个称为Equirectangular-Perspective Projection Attention (EPPA) 模块来实现的。这个模块包括两个关键部分:EPP球面位置编码(EPP Spherical Positional Encoding)和EPP注意力掩码(EPP Attention Mask)。

1. EPP球面位置编码(EPP Spherical Positional Encoding)

        EPP球面位置编码的目的是将全景特征图的极坐标映射到高维空间,以便在全景和透视视图之间学习对应关系。球面位置编码(SPE)函数如下:

SPE(θ,ϕ)=(γ(θ),γ(ϕ))

        其中,θ和ϕ分别是极坐标的纬度和经度,γ是一个将极坐标映射到更高维空间的函数,具体定义为:

γ(θ)=[sin(2πθ),cos(2πθ),…,sin((2L−1)πθ),cos((2L−1)πθ)]

        这里,L 是编码的维度,通常设置为通道数 c 的四分之一,即L=c/4。

2. 投影函数P(.)

        投影函数P(⋅)用于将全景特征图的球面位置编码投影到每个透视特征图上,使得不同格式中的对应像素共享相同的SPE向量。具体过程如下:

        首先计算全景特征图的SPE映射,然后将其投影到每个透视特征图上。将SPE映射添加到相应的特征图上,然后通过一个线性层得到查询Q和键K。

        计算查询Q和键K的矩阵乘积,得到亲和力矩阵A。

        以全景到透视方向为例,亲和力矩阵A的计算如下:

A=Q⋅KT

        其中,Q∈Rc×h×w 和 K∈RN×c×h/2×h/2,N是透视分支中的相机数量,ℎ和w 分别是全景特征图的高度和宽度。

3. EPP注意力掩码(EPP Attention Mask)

        EPP注意力掩码用于鼓励注意力机制关注对应像素。具体过程如下:

        对于全景特征图中的每个像素,使用投影函数P(⋅)将二进制掩码Mj,k​投影到每个透视视图上。

应用高斯核平滑掩码,并将其归一化到[−1,1]。

        将掩码堆叠并重塑为M,然后将其添加到亲和力矩阵A中,得到增强的亲和力矩阵A′。

A′=A+M

        其中,

4. 注意力权重和输出

        最后,对增强的亲和力矩阵A′应用softmax函数得到注意力权重,并将这些权重与值V相乘得到输出:

Attention(Q,K,V)=softmax(A′)⋅V

        这个输出将被用作目标特征图的更新,从而实现全景分支到透视分支的信息传递。

三、相关代码分析

1.示例代码        

以下是一个简单的代码示例,展示了如何使用Python和OpenCV将全景图像转换为透视图像:

import cv2
import numpy as npdef equirectangular_to_perspective(equi_img, fov, theta, phi, width, height):persp_img = np.zeros((height, width, 3), np.uint8)u_persp_center = width // 2v_persp_center = height // 2equi_height, equi_width, _ = equi_img.shapef = (width / 2) / np.tan(np.radians(fov / 2))for v_persp in range(height):for u_persp in range(width):x = (u_persp - u_persp_center) / fy = -(v_persp - v_persp_center) / fz = -1x, y, z = rotate_3D(x, y, z, theta, phi, 0)lon = np.arctan2(y, x)lat = np.arcsin(z)u_equi = 0.5 * (lon / np.pi + 1) * equi_widthv_equi = 0.5 * (lat / np.pi + 0.5) * equi_heightif 0 <= u_equi < equi_width and 0 <= v_equi < equi_height:persp_img[v_persp, u_persp, :] = equi_img[int(v_equi), int(u_equi), :]return persp_imgdef rotate_3D(x, y, z, theta, phi, gamma):R_theta = np.array([[np.cos(theta), -np.sin(theta), 0],[np.sin(theta), np.cos(theta), 0],[0, 0, 1]])R_phi = np.array([[1, 0, 0],[0, np.cos(phi), -np.sin(phi)],[0, np.sin(phi), np.cos(phi)]])R_gamma = np.array([[np.cos(gamma), 0, np.sin(gamma)],[0, 1, 0],[-np.sin(gamma), 0, np.cos(gamma)]])x, y, z = R_theta @ [x, y, z]x, y, z = R_phi @ [x, y, z]x, y, z = R_gamma @ [x, y, z]return x, y, z# 读取全景图像
equi_image_path = 'path_to_your_equirectangular_image.jpg'
equi_img = cv2.imread(equi_image_path)# 定义参数
fov = 90  # 视场角度
theta = np.radians(0)  # 水平旋转角度
phi = np.radians(-30)  # 垂直旋转角度
width = 800  # 透视图像的宽度
height = 600  # 透视图像的高度# 使用函数得到透视图像
persp_img = equirectangular_to_perspective(equi_img, fov, theta, phi, width, height)# 显示透视图像
cv2.imshow('Perspective Image', persp_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

        这个代码首先定义了一个函数equirectangular_to_perspective,它接受一个等距矩形全景图像、视场角度、旋转角度和透视图像的大小。这个函数可以返回透视图像。内部函数rotate_3D是一个三维空间中点的旋转函数,它基于旋转矩阵来实现三个方向上的旋转。

2.rotate_3D函数

        这个函数负责在三维空间中旋转一个点。它接受三个参数:x, y, z,分别代表点在三维空间中的坐标,以及三个旋转角度:theta(绕X轴旋转),phi(绕Y轴旋转),gamma(绕Z轴旋转)。函数返回旋转后的点的坐标。

旋转矩阵如下所示:

  • R_theta:绕X轴旋转
  • R_phi:绕Y轴旋转
  • R_gamma:绕Z轴旋转

这些矩阵分别对应不同的旋转操作,通过矩阵乘法来实现点的旋转。旋转的顺序是先绕X轴,再绕Y轴,最后绕Z轴。

3.equirectangular_to_perspective函数

这个函数是全景图到透视图转换的核心。它接受以下参数:

  • equi_img:全景图像
  • fov:透视图像的视场角度
  • theta:水平旋转角度
  • phi:垂直旋转角度
  • width和height:输出透视图像的宽度和高度

4.代码中的数学和几何原理

  • 球面到笛卡尔的转换:全景图像的每个点可以用球面坐标(经度和纬度)表示,转换为笛卡尔坐标后,可以通过旋转矩阵进行旋转。

  • 视场角度:视场角度决定了透视图像的宽广程度,影响焦距的计算。

  • 旋转:通过旋转矩阵,我们可以模拟相机围绕三个轴的旋转,从而改变视角。

  • 投影:将旋转后的三维点投影到二维平面上,得到透视图像中的点。

四、相关算法优化

        上文中提及的代码中没有明确实现插值算法,这可能导致图像边缘出现锯齿或不连续。且对于大尺寸图像,这种逐像素处理的方法可能效率较低。对于参数而言,可能需要根据实际情况调整FOV、旋转角度等参数,以获得最佳效果。

        为了完善之前的代码,我们可以添加插值功能来提高图像质量,并优化性能。以下是完善后的代码,它包括了双线性插值和一些性能优化:

import cv2
import numpy as npdef rotate_3D(x, y, z, theta, phi):# 绕X轴旋转x_rot, y_rot = x, y * np.cos(theta) - z * np.sin(theta)z_rot = y * np.sin(theta) + z * np.cos(theta)# 绕Y轴旋转x_rot, z_rot = x_rot * np.cos(phi) + z_rot * np.sin(phi), -x_rot * np.sin(phi) + z_rot * np.cos(phi)return x_rot, y_rot, z_rotdef equirectangular_to_perspective(equi_img, fov, theta, phi, width, height):persp_img = np.zeros((height, width, 3), dtype=np.uint8)equi_height, equi_width, _ = equi_img.shapef = width / (2 * np.tan(np.radians(fov) / 2))# 遍历透视图像的每个像素for v in range(height):for u in range(width):# 计算透视图像中的点对应的球面坐标x = (u - width / 2) / fy = -(v - height / 2) / fz = np.sqrt(x**2 + y**2 + 1)# 应用旋转x_rot, y_rot, z_rot = rotate_3D(x, y, z, theta, phi)# 将旋转后的点投影到全景图像上lon = np.arctan2(y_rot, x_rot)lat = np.arcsin(z_rot)# 计算全景图像中的对应像素位置u_equi = (lon + np.pi) / (2 * np.pi) * equi_widthv_equi = (np.pi - lat) / np.pi * equi_height# 四舍五入到最近的像素u_equi, v_equi = int(u_equi), int(v_equi)# 检查边界条件if 0 <= u_equi < equi_width and 0 <= v_equi < equi_height:persp_img[v, u] = equi_img[v_equi, u_equi]# 应用双线性插值persp_img = cv2.bilinearResize(persp_img, (height, width))return persp_img# 读取全景图像
equi_image_path = 'path_to_your_equirectangular_image.jpg'
equi_img = cv2.imread(equi_image_path)# 定义参数
fov = 90  # 视场角度
theta = np.radians(0)  # 水平旋转角度
phi = np.radians(-30)  # 垂直旋转角度
width = 800  # 透视图像的宽度
height = 600  # 透视图像的高度# 使用函数得到透视图像
persp_img = equirectangular_to_perspective(equi_img, fov, theta, phi, width, height)# 显示透视图像
cv2.imshow('Perspective Image', persp_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码改进点:

  1. 双线性插值:使用cv2.bilinearResize函数对透视图像进行双线性插值,以提高图像质量。

  2. 边界检查:在将全景图像的像素值赋给透视图像之前,添加了边界检查,以确保不会访问全景图像数组之外的元素。

  3. 性能优化:通过减少不必要的计算和使用OpenCV的内置函数,提高了代码的执行效率。

        这段代码提供了一个更完整的解决方案,用于将全景图像转换为透视图像,并应用了双线性插值以提高图像质量。

相关文章:

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程&#xff0c;它涉及到将一个360度的全景图像转换为一个具有透视效果的图像&#xff0c;这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像&#xff0c;它通过将球面图像映射到平面上得到&#xf…...

matlab 实现混沌麻雀搜索算法的光伏MPPT控制仿真

1、内容简介 略 103-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

【设计模式】【行为型模式(Behavioral Patterns)】之策略模式(Strategy Pattern)

1. 设计模式原理说明 策略模式&#xff08;Strategy Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许你定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用算法的客户。通过这种方式&#xff0c;客户端可…...

深度学习笔记之BERT(三)RoBERTa

深度学习笔记之RoBERTa 引言回顾&#xff1a;BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...

【软考速通笔记】系统架构设计师③——信息安全技术基础知识

文章目录 一、前言二、信息安全基础知识2.1 信息安全的基本要求2.2 信息安全的范围2.3 网络安全表现2.4 安全措施包括 三、信息安全系统的组成框架3.1 技术体系&#xff1a;3.2 组织机构体系&#xff1a;3.3 管理体系 四、信息加解密技术4.1 对称密钥加密算法4.2 非对称密钥加密…...

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中&#xff0c;数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统&#xff0c;不仅可以用作缓存、消息代理&#xff0c;还可以扩展为向量数据库&#xff0c;实现高效的相…...

设计模式-装饰者模式

背景 有一个咖啡馆有 单品咖啡&#xff1a;意大利浓咖啡、美式咖啡、无因咖啡 调料&#xff1a;牛奶、巧克力 点单时需要点一个单品咖啡&#xff0c;可以选择加调料或者不加。 最后计算价格。 较好的传统思路&#xff1a; 创建一个抽象的咖啡类&#xff0c;其中有各个调…...

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;是两个不同的概念&#xff0c;但它们在某些方面有相似之处&#xff0c;也有明显的区别。 &#x1f511;过滤器&#xff08;Filter&#xff09; 过滤器是Asp.NET Core中用于…...

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…...

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…...

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…...

IT成长之路-ubuntu驱动篇

历时3天的蹂躏&#xff0c;总结驱动安装全面教程。 步骤一、安装gcc、g和make包 #脚本更新 sudo apt-get update #编译gcc sudo apt-get install gcc #编译g sudo apt-get install g #编译make sudo apt-get install make 注意&#xff1a; gcc、g版本可能会导致显卡驱动安…...

AI大模型如何赋能电商行业,引领变革

目录 1.概述 1.1. 购物推荐系统 1.2. 会员分类与客户细分 1.3. 动态商品定价 1.4. 库存和供应链管理 1.5. 客户服务与体验 1.6. 内容生成与管理 2.AI技术在电商中的创新应用 2.1.淘宝 2.2.京东 2.3.华为 2.4.小米 3.AI技术在提高电商平台销售效率方面发挥的作用 …...

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…...

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题&#xff0c;BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”&#xff0c;更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法&#xff0c;目前已支持 ipm-based 、lss-based、 transformer-based&#xff…...

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…...

构建一个去中心化的零售生态参与者的商业模型

在数字化和去中心化技术快速发展的背景下&#xff0c;传统零售行业正迎来革命性的转型。去中心化零售生态不仅让消费者、商家和内容创作者在同一平台上共同参与价值的创造和分配&#xff0c;还推动了零售体验、数据控制和社会互动的彻底变革。本文将探讨如何构建一个去中心化的…...

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…...

MyBatis(mybatis_plus)中TypeHandler的使用教程

MyBatis&#xff08;mybatis_plus&#xff09;中TypeHandler的使用教程 一.TypeHandler作用及其使用场景 在我们平常开发操作数据库时&#xff0c;查询、插入数据等操作行为&#xff0c;有时会报数据类型不匹配异常&#xff0c;就可以得知数据的类型是不唯一的必然是多种不同…...

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO&#xff0c;这些类型可以向 string 写入数据&#xff0c;也可以从 string 读取数据&#xff0c;就像 string 是一个 IO 流一样。 istringstream 从 string 读数据&#xff1b;ostringstream 向 string 写入数据&…...

C# 反射详解

反射是C#中的一个强大特性&#xff0c;允许程序在运行时检查和操作类型和对象的信息。 通过反射&#xff0c;你可以获取类型的属性、方法、构造函数等信息&#xff0c;并可以动态创建对象、调用方法或访问属性&#xff0c;甚至可以实现某些框架或库的核心功能。 反射的基本概念…...

量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…...

【开发商城系统】

在广西开发商城系统&#xff0c;可以按照以下步骤进行&#xff1a; 确定项目需求&#xff1a;与客户沟通&#xff0c;了解商城系统所需的功能和特性&#xff0c;并确定项目的预算和时间限制。 进行市场调研&#xff1a;了解广西地区的电商市场情况&#xff0c;包括竞争对手、消…...

C++设计模式-享元模式

动机(Motivation) 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍然能够透明地使用面向对象的方式来进行操作…...

Spark——安装步骤详细教程

1、安装步骤 1、上传 cd /opt/modules 2、解压 tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 3、重命名 cd /opt/installs mv spark-3.1.2-bin-hadoop3.2 spark-local 4、创建软链接 ln -s spark-local spark 5、配置环境变量&#xff1a; vi /etc/prof…...

摆烂仙君传——深度学习秘境奇缘

第一章&#xff1a;深度学习秘境 在修仙界与科技交织的边缘&#xff0c;八荒六合九天无上摆烂仙君在其高科技修炼室中感应到一股神秘的召唤。这股力量似乎与他的灵魂产生了共鸣&#xff0c;引导他前往传说中的深度学习秘境。在那里&#xff0c;古老的仙法与前沿的算法交织&…...

C++设计模式:桥接模式(Bridge)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一个用来解耦的设计模式&#xff0c;它将抽象层和实现层分离开&#xff0c;让它们可以独立变化。用最简单的话来说&#xff0c;就是让你能够改变抽象的功能和具体的实现&#xff0c;而不需要修改…...

c++源码阅读__smart_ptr__正文阅读

文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…...

halcon3D 1:1切片轮廓投影技术,透过像素距离,知实际物体的尺寸

首先说做个什么事儿 对一个物体的横截面进行1:1或者1:10的投影&#xff0c;也就是说世界物体1mm的话&#xff0c;投影到image中占1个或者10个像素值&#xff0c;这样&#xff0c;就可以透过直接计算image中的像素距离&#xff0c;知道实际物体的尺寸 用一张图说明是这样的。物…...

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法 1. npm库xss依赖的使用方法1.1 xss库定义1.2 xss库功能 2. vue3 中 wangeditor 使用xss库解决 XSS 攻击的方法和示例2.1 在终端执行如下命令安装 xss 依赖2.2 在使用 wangeditor 的地…...

计算机网络 实验七 NAT配置实验

一、实验目的 通过本实验理解网络地址转换的原理和技术&#xff0c;掌握扩展NAT/NAPT设计、配置和测试。 二、实验原理 NAT配置实验的原理主要基于网络地址转换&#xff08;NAT&#xff09;技术&#xff0c;该技术用于将内部私有网络地址转换为外部公有网络地址&#xff0c;从…...

UI设计-色彩、层级、字体、边距(一)

一.色彩&#xff1a;色彩可以影响人的心理与行动&#xff0c;具有不同的象征意义&#xff1b;有冷暖&#xff0c;轻重&#xff0c;软硬等等。 1.色彩情绪&#xff1a;最直观的视觉感受 一个活动的页面所用的颜色必须要与其内容相适应&#xff0c;让人看起来舒服。有时我们会不…...

【网络安全】

黑客入侵 什么是黑客入侵&#xff1f; “黑客”是一个外来词&#xff0c;是英语单词hacker的中文音译。最初&#xff0c;“黑客”只是一个褒义词&#xff0c;指的是那些尽力挖掘计算机程序最大潜力的点脑精英&#xff0c;他们讨论软件黑客的技巧和态度&#xff0c;以及共享文化…...

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…...

【MySQL】MySQL从入门到放弃

文章目录 声明MYSQL一,架构1.1.网络连接层数据库连接池 1.2.系统服务层1.2.1.SQL接口1.2.2.存储过程1.2.3.触发器1.2.4.解析器1.2.5.优化器1.2.6.缓存,缓冲 1.3.存储引擎层1.4.文件系统层1.4.1.日志模块1.4.2.数据模块 二,SQL 执行2.1.执行流程2.2.刷盘2.3.返回 三.库表设计3.1…...

redis-cluster集群搭建

集群节点信息 192.168.222.131:46379 主要节点1 192.168.222.131:46380 从节点1 192.168.222.131:46381 从节点2192.168.222.132:46379 主要节点2 192.168.222.132:46380 从节点1 192.168.222.132:46381 从节点2192.168.222.133:46379 主要节点3 192.168.222.133:46380 从节点…...

C语言解决空瓶换水问题:高效算法与实现

标题&#xff1a;C语言解决空瓶换水问题&#xff1a;高效算法与实现 一、问题描述 在一个饮料促销活动中&#xff0c;你可以通过空瓶换水的方式免费获得更多的水&#xff1a;3个空瓶可以换1瓶水。喝完这瓶水后&#xff0c;空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...

单例模式入门

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 它的运作方式是这样的&#xff1a; 如果你创建了一个对象&#xff0c; 同时过一会儿后你决定再创建一个新对象&#xff0c; 此时你会获得之前已创建的…...

MongoDB快速入门

1 MongoDB 1.1 MongoDB 概念 1.1.1 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在Mo…...

c语言中的extern是什么

在C语言中&#xff0c;extern 是一个关键字&#xff0c;用于声明变量或函数的外部链接。它告诉编译器该变量或函数的定义在其他文件中&#xff0c;编译器在编译当前文件时并不需要知道变量或函数的具体定义&#xff0c;而是将它们视作外部引用。 1. 变量的 extern 声明 当你在…...

CTF之密码学(摩斯密码)

一、历史背景 摩尔斯电码发明于1837年&#xff0c;是一种早期的数字化通信形式。它最初由艾尔菲德维尔和摩尔斯等人构思&#xff0c;通过点、划和中间的停顿&#xff0c;把各个字元以及标点符号彼此独立地发送出去。这种标识不同符号的方案后来被放入摩尔斯的专利中&#xff0…...

Flink 任务启动脚本-V2(包括ck启动)

#!/bin/bash#crontab时设置&#xff0c;如果依赖其他环境变量配置&#xff0c;可以在脚本执行一下环境变量脚本 source /etc/profile# 进入脚本目录 curdirdirname "$0" curdircd "$curdir"; pwd echo "进入启动脚本目录 $curdir"# 定义应用程序…...

16:00面试,16:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

selinux和防火墙

SElinux 1、selinux简介 SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linux。 SELinux 主要由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 SELinux是对程序、文件等权限设置依据的一个内核模块。…...

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…...

[241127] Mistral AI 更新 Le Chat,免费提供前沿 AI 助手!| TrendForce 预测 2025 十大科技趋势

目录 Mistral AI 更新 Le Chat&#xff0c;免费提供前沿 AI 助手&#xff01;TrendForce 预测 2025 十大科技趋势 Mistral AI 更新 Le Chat&#xff0c;免费提供前沿 AI 助手&#xff01; Mistral AI 宣布对其免费 AI 助手 Le Chat 进行重大更新&#xff0c;新增多项强大功能&…...

go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库&#xff0c;提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。 carbon 目前已捐赠给 dromara 开源组织&#xff0c;已被 awesome-go 收录&am…...

linux安全管理-账号口令

文章目录 1 设备密码复杂度策略2 设备密码生存周期、最小长度、更改最小间隔天数和过期前警告天数3 使用 PAM 认证禁止指定组之外的用户使用 su 切换到 root4 制作用户权限对照表 1 设备密码复杂度策略 1、配置内容 检查密码复杂度策略中设置的特殊字符、大写字母、小写字母和…...

uni-app自定义底部tab并且根据字段显示和隐藏

首先将所有tab使用到的页面创建好并且在pages里面配置好&#xff0c;要在pages.json中的"tabBar里面配置"custom": true将自带的tab底部导航关闭 "pages": [{"path": "pages/mine/mine","style": {"navigationBa…...