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

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法

1、Lucas-Kanade光流法

相机所拍摄到的图像随相机视角的变化而变化,这种变化也可以理解为图像中像素的反向移动。“光流”(Optical Flow)是指通过分析连续图像帧来估计场景中像素或特征点的运动的技术,即根据连续的两张图片和已知某个固定的空间点在 t t t时刻对应的的像素坐标 q \mathbf{q} q,估计其他时刻该空间点对应的像素坐标 p \mathbf{p} p光流法常用算法为LK光流法

在这里插入图片描述

LK光流法常用算法为常用的光流法,在LK光流法中,认为图像中每个像素坐标 [ u , v ] T [u,v]^{T} [u,v]T处的灰度都是随时间 t t t变化的函数,且做如下两条假设:

  1. 灰度不变假设:同一空间点对应的像素坐标的灰度值,在各个图像中是不变的
  2. 局部运动一致假设:相邻区域内的像素具有相同的运动
1.1、解析解法

设对应于同一空间点的像素随时间变化的函数为 ( u ( t ) , v ( t ) ) (u(t),v(t)) (u(t),v(t)),根据灰度不变假设,存在固定灰度值 C C C,有
I ( u ( t ) , v ( t ) , t ) = C (1) I(u(t),v(t),t)=C\tag{1} I(u(t),v(t),t)=C(1)
在上式中,对 t t t求导得到
∂ I ∂ u ∂ u ∂ t + ∂ I ∂ v ∂ v ∂ t + ∂ I ∂ t = 0 (2) \frac{\partial{I}}{\partial{u}}\frac{\partial{u}}{\partial{t}}+\frac{\partial{I}}{\partial{v}}\frac{\partial{v}}{\partial{t}}+\frac{\partial{I}}{\partial{t}}=0\tag{2} uItu+vItv+tI=0(2)
∇ t u = ∂ u ∂ t , ∇ t v = ∂ v ∂ t \nabla_{t}u=\frac{\partial{u}}{\partial{t}},\nabla_{t}v=\frac{\partial{v}}{\partial{t}} tu=tu,tv=tv x x x轴, y y y轴方向上的像素移动速度,这两个量也是LK光流法的求解目标, ∇ u I = ∂ I ∂ u , ∇ v I = ∂ I ∂ v \nabla_{u}I=\frac{\partial{I}}{\partial{u}},\nabla_{v}I=\frac{\partial{I}}{\partial{v}} uI=uI,vI=vI为灰度在 x , y x,y x,y方向上的梯度,也可称为像素梯度, ∇ t I = ∂ I ∂ t \nabla_{t}I=\frac{\partial{I}}{\partial{t}} tI=tI为固定点处灰度对时间的导数

( 2 ) (2) (2)可以化简为
[ ∇ u I , ∇ v I ] [ ∇ t u ∇ t v ] = − ∇ t I (3) [\nabla_{u}I,\nabla_{v}I]\begin{bmatrix}\nabla_{t}u\\\nabla_{t}v\end{bmatrix}=-\nabla_{t}I\tag{3} [uI,vI][tutv]=tI(3)
w = [ ∇ t u ∇ t v ] \mathbf{w}=\begin{bmatrix}\nabla_{t}u\\\nabla_{t}v\end{bmatrix} w=[tutv],上式是一个二元一次方程,仅靠该方程无法计算 w \mathbf{w} w,还需引入其他约束。

根据局部运动一致假设,可以认为像素 q i \mathbf{q}_{i} qi附近的某邻域内全部像素 q j , j = 1 , ⋯ , w \mathbf{q}_{j},j=1,\cdots,w qj,j=1,,w Δ t \Delta{t} Δt时间段内具有相同的运动,因此 ( 3 ) (3) (3)可以写成
[ ∇ u I 1 ( q 1 ) , ∇ v I 1 ( q 1 ) ⋮ ∇ u I 1 ( q w ) , ∇ v I 1 ( q w ) ] w = [ − ∇ t I ( q 1 ) ⋮ − ∇ t I ( q w ) ] (4) \begin{bmatrix}\nabla_{u} I_{1}(\mathbf{q}_{1}),\nabla_{v} I_{1}(\mathbf{q}_{1})\\\vdots\\ \nabla_{u} I_{1}(\mathbf{q}_{w}),\nabla_{v} I_{1}(\mathbf{q}_{w})\end{bmatrix}\mathbf{w}=\begin{bmatrix}-\nabla_{t}I(\mathbf{q}_{1})\\\vdots\\-\nabla_{t}I(\mathbf{q}_{w})\end{bmatrix}\tag{4} uI1(q1),vI1(q1)uI1(qw),vI1(qw)w=tI(q1)tI(qw)(4)
其中
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \nabla_{u} I_{…
( 4 ) (4) (4)中系数矩阵为 A \mathbf{A} A,等号右侧矩阵为 b \mathbf{b} b,则方程变为
A w = b \mathbf{A}\mathbf{w}=\mathbf{b} Aw=b
上式是关于 w \mathbf{w} w的超定方程组,可以通过最小二乘的方式求解,即令
w ∗ = arg ⁡ min ⁡ w ∥ A w − b ∥ 2 (6) \mathbf{w}^{\ast}=\underset{\mathbf{w}}{\arg\min}\,\|\mathbf{A}\mathbf{w}-\mathbf{b}\|^{2}\tag{6} w=wargminAwb2(6)
根据§1,容易求出 w ∗ \mathbf{w}^{\ast} w,根据 q i + w ∗ Δ t \mathbf{q}_{i}+\mathbf{w}^{\ast}\Delta{t} qi+wΔt即可计算新像素位置

1.2、优化解法

通过最小化两张图像对应像素邻域内的灰度差也可以求出给定点 q \mathbf{q} q在第二张图像中的对应像素 p \mathbf{p} p,即
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \mathbf{p}^{\a…
e j \mathbf{e}_{j} ej p \mathbf{p} p的雅可比矩阵为
J j = ∂ e j ∂ p = [ − ∇ u I 2 ( p j ) − ∇ v I 2 ( p j ) ] (8) \mathbf{J}_{j}=\frac{\partial\mathbf{e}_{j}}{\partial\mathbf{p}}=\begin{bmatrix}-\nabla_{u}I_{2}(\mathbf{p}_{j})\\ -\nabla_{v}I_{2}(\mathbf{p}_{j})\end{bmatrix}\tag{8} Jj=pej=[uI2(pj)vI2(pj)](8)
再求出
H k = ∑ j = 1 w J j J j T b k = ∑ j = 1 w J j T e j \mathbf{H}_{k}=\sum_{j=1}^{w}\mathbf{J}_{j}\mathbf{J}_{j}^{T}\quad\quad \mathbf{b}_{k}=\sum_{j=1}^{w}\mathbf{J}^{T}_{j}\mathbf{e}_{j} Hk=j=1wJjJjTbk=j=1wJjTej
增量方程为如下式,可以通过增量方程计算更新量
H k Δ p k = − b k \mathbf{H}_{k}\Delta\mathbf{p}_{k}=-\mathbf{b}_{k} HkΔpk=bk
得到更新量后,第二张图片中像素坐标可以更新为
p k + 1 = p k + Δ p k \mathbf{p}_{k+1}=\mathbf{p}_{k}+\Delta\mathbf{p}_{k} pk+1=pk+Δpk

2、直接法

在这里插入图片描述

直接法并不单独估计第二张图片中的像素点位置,而是对第一张图片中的像素点,根据相机位姿估计值寻找其在第二张图片中对应的像素位置,并通过图片中对应像素的灰度差不断优化相机位姿变换,得到最优位姿变换,同时使两张图片的灰度差最小。下面进行详细说明。

已知像素 q i , i = 1 , ⋯ , n \mathbf{q}_{i},i=1,\cdots,n qi,i=1,,n和其对应的深度,及摄像机内参矩阵
K = [ f x 0 c x 0 f y c y 0 0 1 ] \mathbf{K}=\left[\begin{array}{ccc} f_{x}&0&c_{x}\\ 0&f_{y}&c_{y}\\ 0&0&1 \end{array}\right] K=fx000fy0cxcy1
可以还原出三维空间位置 x i \mathbf{x}_{i} xi,令 X i = [ x i 1 ] ∈ R 4 \mathbf{X}_{i}=\begin{bmatrix}\mathbf{x}_{i}\\1\end{bmatrix}\in\mathbb{R}^{4} Xi=[xi1]R4,并记从第一张图片到第二张图片对应的相机位姿变换为 T ∈ S E ( 3 ) \mathbf{T}\in SE(3) TSE(3),则 x i \mathbf{x}_{i} xi在第二个相机坐标系下的空间坐标为
y i = ( T X i ) 1 : 3 = [ X , Y , Z ] T \mathbf{y}_{i}=(\mathbf{T}\mathbf{X}_{i})_{1:3}=[X,Y,Z]^{T} yi=(TXi)1:3=[X,Y,Z]T
对应的像素坐标为
p i = 1 Z ( K y i ) 1 : 2 \mathbf{p}_{i}=\frac{1}{Z}(\mathbf{K}\mathbf{y}_{i})_{1:2} pi=Z1(Kyi)1:2
直接法求解优化问题
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \mathbf{T}^{\a…
暂时省略下标,根据链式求导法则得到
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\partial…
容易得到
∂ p ∂ y = [ f x Z 0 − f x X Z 2 0 f y Z − f x Y Z 2 ] ∂ y ∂ T = [ I , − y ∧ ] \frac{\partial{\mathbf{p}}}{\partial\mathbf{y}}=\begin{bmatrix} \frac{f_{x}}{Z}&0&-\frac{f_{x}X}{Z^{2}}\\ 0&\frac{f_{y}}{Z}&-\frac{f_{x}Y}{Z^{2}} \end{bmatrix}\quad\quad\frac{\partial\mathbf{y}}{\partial\mathbf{T}}=[\mathbf{I},-\mathbf{y}^{\wedge}] yp=[Zfx00ZfyZ2fxXZ2fxY]Ty=[I,y]
因此 ( 10 ) (10) (10)后两项可以写成
∂ p ∂ T = ∂ p ∂ y ∂ y ∂ T = [ f x Z 0 − f x X Z 2 − f x X Y Z 2 f x + f x X 2 Z 2 − f x Y Z 0 − f y Z − f x Y Z 2 − f y − f y Y 2 Z 2 f x X Y Z 2 f x X Z ] (11) \frac{\partial\mathbf{p}}{\partial\mathbf{T}}=\frac{\partial\mathbf{p}}{\partial\mathbf{y}}\frac{\partial\mathbf{y}}{\partial\mathbf{T}}=\begin{bmatrix} \frac{f_{x}}{Z}&0&-\frac{f_{x}X}{Z^{2}}&-\frac{f_{x}XY}{Z^{2}}&f_{x}+\frac{f_{x}X^{2}}{Z^{2}}&-\frac{f_{x}Y}{Z}\\ 0&-\frac{f_{y}}{Z}&-\frac{f_{x}Y}{Z^{2}}&-f_{y}-\frac{f_{y}Y^{2}}{Z^{2}}&\frac{f_{x}XY}{Z^{2}}&\frac{f_{x}X}{Z} \end{bmatrix}\tag{11} Tp=ypTy=[Zfx00ZfyZ2fxXZ2fxYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fxXYZfxYZfxX](11)
( 10 ) (10) (10)又可以写成
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\partial…
问题 ( 9 ) (9) (9)的雅可比矩阵为
J i = ∂ e i ∂ T \mathbf{J}_{i}=\frac{\partial\mathbf{e}_{i}}{\partial\mathbf{T}} Ji=Tei
由此得到
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲\mathbf{H}_{k}=…
则更新量可以通过下式计算
H k Δ T k = − b k \mathbf{H}_{k}\Delta\mathbf{T}_{k}=-\mathbf{b}_{k} HkΔTk=bk

并通过下式更新
T k + 1 = E x p ( Δ T k ) T k \mathbf{T}_{k+1}=\mathrm{Exp}(\Delta\mathbf{T}_{k})\mathbf{T}_{k} Tk+1=Exp(ΔTk)Tk
最终得到最优的位姿变换

实验

直接法在kitti数据集上的效果如下图,可以看到追踪效果良好
在这里插入图片描述

附录

§1、标准最小二乘问题

标准最小二乘问题对给定 A ∈ R M × N \mathbf{A}\in\mathbb{R}^{M\times{N}} ARM×N,计算 x ∗ ∈ R N \mathbf{x}^{\ast}\in\mathbb{R}^{N} xRN,使得
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \mathbf{x}^{\a…
首先对 A \mathbf{A} A进行SVD分解
A = U [ Σ r × r O O O ] V T \mathbf{A}=\mathbf{U} \begin{bmatrix} \boldsymbol\Sigma_{r\times{r}}&\mathbf{O}\\ \mathbf{O}&\mathbf{O} \end{bmatrix}\mathbf{V}^{T} A=U[Σr×rOOO]VT
A \mathbf{A} A的伪逆为
A † = V [ Σ r × r − 1 O O O ] U T (A2) \mathbf{A}^{\dagger}=\mathbf{V} \begin{bmatrix} \boldsymbol\Sigma_{r\times{r}}^{-1}&\mathbf{O}\\ \mathbf{O}&\mathbf{O} \end{bmatrix}\mathbf{U}^{T}\tag{A2} A=V[Σr×r1OOO]UT(A2)
可以证明,满足 ( A 1 ) \mathrm{(A1)} (A1)的模长最小的解为
x ∗ = A † b (A3) \mathbf{x}^{\ast}=\mathbf{A}^{\dagger}\mathbf{b}\tag{A3} x=Ab(A3)
特别地,当 r a n k ( A ) = N \mathrm{rank}(\mathbf{A})=N rank(A)=N时, A † = ( A T A ) − 1 A \mathbf{A}^{\dagger}=(\mathbf{A}^{T}\mathbf{A})^{-1}\mathbf{A} A=(ATA)1A ( A 1 ) \mathrm{(A1)} (A1)仅有如下一个解
x ∗ = ( A T A ) − 1 A b (A4) \mathbf{x}^{\ast}=(\mathbf{A}^{T}\mathbf{A})^{-1}\mathbf{A}\mathbf{b}\tag{A4} x=(ATA)1Ab(A4)

相关文章:

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化,这种变化也可以理解为图像中像素的反向移动。“光流”(Optical Flow)是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…...

C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型

用自己定义的数据结构作为rtree的key。 // rTree的key struct OverlapKey {using BDPoint boost::geometry::model::point<double, 3, boost::geometry::cs::cartesian>; //双精度的点using MyRTree boost::geometry::index::rtree<OverlapKey, boost::geometry::in…...

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”&#xff1f;韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中&#xff0c;母亲Jang Ji-sung透过VR头显&#xff0c;看到了三年前因白血病去世的女儿Nayeon。当她伸出双手&#xff0c;居然能摸到女儿的…...

穿越数据迷宫:C++哈希表的奇幻旅程

文章目录 前言&#x1f4d4;一、unordered系列关联式容器&#x1f4d5;1.1 unordered 容器概述&#x1f4d5;1.2 哈希表在 unordered 容器中的实现原理&#x1f4d5;1.3 unordered 容器的特点 &#x1f4d4;二、unordered_set 和 unordered_map 的基本操作&#x1f4d5;2.1 un…...

SMT32 智能环境监测系统 嵌入式初学者课堂小组作业

一、应用知识 1&#xff0c;开发语言&#xff1a;C语言 2&#xff0c;开发工具&#xff1a;Keil uVision5、Setup_JLinkARM_V415e 3&#xff0c;开发平台&#xff1a;XCOM V2.0 4&#xff0c;开发知识&#xff1a;温湿度传感DHT11、STM32F4xx中文参考手册 5&#xff0c;文…...

20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡

20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡 2024/11/14 15:44 缘起&#xff1a;使用EVB2的方案&#xff0c;RJ45加进去怎么也不通。 实在没有办法&#xff0c;只能将荣品的SDK&#xff1a;rk-android13-20240713.tgz 解压缩&#xff0c;编译之…...

JVM这个工具的使用方法

JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的基础环境&#xff0c;它提供了内存管理、线程管理和性能监控等功能。吃透JVM诊断方法&#xff0c;可以帮助开发者更有效地解决Java应用在运行时遇到的问题。以下是一些常见的JVM诊断方法&#xff1a; 使用JConsole: JCon…...

创建型设计模式与面向接口编程

创建型设计模式&#xff08;Creational Patterns&#xff09;的主要目的之一就是帮助实现面向接口编程&#xff0c;避免直接创建实现类的实例。通过这些模式&#xff0c;可以将对象的创建过程封装起来&#xff0c;使得客户端代码不需要知道具体的实现类&#xff0c;从而提高代码…...

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…...

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 域名解析 https://www.zhaowa.com > ip 1. 切HOST&#xff1f; > 浏览器缓存映射、系统、路由、运营商、根服务器 2. 实际的静态文件存放&#xff1f; 大流量 > 多个…...

STL - vector的使用和模拟实现

目录 一&#xff1a;vector的构造函数 二&#xff1a;vector的迭代器 三vector的空间增长问题 四&#xff1a;vector 增删查改接口 五&#xff1a;vector的模拟实现 &#xff08;一&#xff09;一些简单接口的实现&#xff1a; &#xff08;二&#xff09;一些复杂接口的…...

《鸿蒙生态:开发者的机遇与挑战》

一、引言 在当今科技飞速发展的时代&#xff0c;操作系统作为连接硬件与软件的核心枢纽&#xff0c;其重要性不言而喻。鸿蒙系统的出现&#xff0c;为开发者带来了新的机遇与挑战。本文将从开发者的角度出发&#xff0c;阐述对鸿蒙生态的认知和了解&#xff0c;分析鸿蒙生态的…...

【C++融会贯通】二叉树进阶

目录 一、内容说明 二、二叉搜索树 2.1 二叉搜索树概念 2.2 二叉搜索树操作 2.2.1 二叉搜索树的查找 2.2.2 二叉搜索树的插入 2.2.3 二叉搜索树的删除 2.3 二叉搜索树的实现 2.3.1 二叉搜索树的节点设置 2.3.2 二叉搜索树的查找函数 2.3.2.1 非递归实现 2.3.2.2 递…...

使用python-Spark使用的场景案例具体代码分析

使用场景 1. 数据批处理 • 日志分析&#xff1a;互联网公司每天会产生海量的服务器日志&#xff0c;如访问日志、应用程序日志等。Spark可以高效地读取这些日志文件&#xff0c;对数据进行清洗&#xff08;例如去除无效记录、解析日志格式&#xff09;、转换&#xff08;例如…...

如何查看本地的个人SSH密钥

1.确保你的电脑上安装了 Git。 你可以通过终端或命令提示符输入以下命令来检查&#xff1a; git --version 如果没有安装&#xff0c;请前往 Git 官网 下载并安装适合你操作系统的版本。 2.查找SSH密钥 默认情况下&#xff0c;SSH密钥存储在你的用户目录下的.ssh文件夹中。…...

本人认为 写程序的三大基本原则

1. 合法性 ‌定义‌&#xff1a;合法性指的是程序必须遵守法律法规和道德规范&#xff0c;不得用于非法活动。 ‌建议‌&#xff1a; ‌了解法律法规‌&#xff1a;在编写程序之前&#xff0c;了解并遵守所在国家或地区的法律法规&#xff0c;特别是与数据隐私、版权、网络安…...

A030-基于Spring boot的公司资产网站设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

React Hooks 深度解析与实战

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks 深度解析与实战 React Hooks 深度解析与实战 React Hooks 深度解析与实战 引言 什么是 Hooks? 定义 为什么需要 Ho…...

#渗透测试#SRC漏洞挖掘#蓝队基础之网络七层杀伤链04 终章

网络杀伤链模型&#xff08;Kill Chain Model&#xff09;是一种用于描述和分析网络攻击各个阶段的框架。这个模型最初由洛克希德马丁公司提出&#xff0c;用于帮助企业和组织识别和防御网络攻击。网络杀伤链模型将网络攻击过程分解为多个阶段&#xff0c;每个阶段都有特定的活…...

计算机毕业设计Python+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...