2D-2D对极几何中的基本矩阵、本质矩阵和单应矩阵

本文主要参考高翔博士的视觉SLAM十四讲第二版中的7.3章节内容。

文章目录

  • 1 对极约束
  • 2 本质矩阵E
  • 3 单应矩阵

1 对极约束

现在,假设我们从两张图像中得到了一对配对好的特征点,如图7.9所示(假如后面我们有若干对这样的匹配点,根据这些点的匹配关系,我们就可以恢复处相机的运动),目的是希望求取两帧图像之间的运动:

请添加图片描述
假设:

  • 第一帧和第二帧的运动为 R , t R,t Rt
  • 两个相机的中心分别为 O 1 , O 2 O_1,O_2 O1O2
  • I 1 I_1 I1中有一个特征点 p 1 p_1 p1
  • I 2 I_2 I2中对应特征点 p 2 p_2 p2

如果 p 1 , p 2 p_1, p_2 p1,p2两个特征点匹配正确,说明它们确实是同一个空间点在两个成像平面上的投影

那么在以上的假设和匹配正确的基础上,有以下术语来描述它们的关系,连线 O 1 p 1 ⃗ \vec{O_1p_1} O1p1 和连线 O 2 p 2 ⃗ \vec{O_2p_2} O2p2 在三维空间中会相交于点 P P P

  • 极平面: O 1 , O 2 , P O_1,O_2,P O1O2P三个点确定的平面
  • 基线: O 1 , O 2 O_1,O_2 O1O2的连线
  • 极点: O 1 , O 2 O_1,O_2 O1O2的连线与成像平面 I 1 , I 2 I_1,I_2 I1I2的交点 e 1 , e 2 e_1,e_2 e1e2
  • 极线:极平面与两个像平面 I 1 , I 2 I_1,I_2 I1I2之间的相交线 l 1 , l 2 l_1,l_2 l1l2

从代数角度来分析这里的几何关系,假设在第一帧的坐标系下,设 P P P的空间位置为:
P = [ X , Y , Z ] T (1) P=[X,Y,Z]^T\tag{1} P=[X,Y,Z]T(1)

根据针孔相机模型,可知两个像素点 p 1 , p 2 p_1, p_2 p1,p2的像素位置为:
s 1 p 1 = K P , s 2 p 2 = K ( R P + t ) (2) s_1p_1=KP, \quad s_2p_2=K(RP+t)\tag{2} s1p1=KP,s2p2=K(RP+t)(2)
其中 K K K为相机内参矩阵, R , t R,t Rt为两个坐标系的相机运动。

由于齐次坐标下,一个向量将等于它自身乘以任意的非零常数,这通常表达一个投影关系, s 1 p 1 s_1p_1 s1p1 p 1 p_1 p1成投影关系,它们在齐次坐标的意义下是相等的(尺度意义下的相等),故记作:
s p ≃ p sp\simeq p spp
那么,公式2的投影关系可写为:
p 1 ≃ K P , p 2 ≃ K ( R P + t ) (3) p_1\simeq KP, \quad p_2\simeq K(RP+t)\tag{3} p1KP,p2K(RP+t)(3)
现取:
x 1 = K − 1 p 1 , x 2 = K − 1 p 2 (4) x_1=K^{-1}p_1, \quad x_2=K^{-1}p_2 \tag{4} x1=K1p1,x2=K1p2(4)
这里 x 1 , x 2 x_1, x_2 x1,x2是两个像素点的归一化平面上的坐标,代入公式3得:
x 2 ≃ R x 1 + t (5) x_2\simeq Rx_1+t \tag{5} x2Rx1+t(5)
两边同时左乘 t ∧ t^{\wedge} t得: t ∧ t = 0 t^{\wedge}t=0 tt=0
t ∧ x 2 ≃ t ∧ R x 1 (6) t^{\wedge}x_2 \simeq t^{\wedge}Rx_1 \tag{6} tx2tRx1(6)
然后两侧再同时左乘 x 2 T x_2^T x2T得:
x 2 T t ∧ x 2 ≃ x 2 T t ∧ R x 1 (7) x_2^Tt^{\wedge}x_2 \simeq x_2^Tt^{\wedge}Rx_1 \tag{7} x2Ttx2x2TtRx1(7)
观测等式左侧, t ∧ x 2 t^{\wedge}x_2 tx2是一个与 t t t x 2 x_2 x2都垂直的向量,它再和 x 2 x_2 x2做内积时,结果是 0 0 0,又由于左侧和右侧是齐次坐标下的尺度意义上的相等, 0 0 0乘以任意非零常数的结果也为 0 0 0,于是可以把 ≃ \simeq 写出通常的等号,即:
x 2 T t ∧ R x 1 = 0 (8) x_2^Tt^{\wedge}Rx_1=0 \tag{8} x2TtRx1=0(8)
然后,结合公式4,重新代入 p 1 , p 2 p_1,p_2 p1p2得:
p 2 T K − T t ∧ R K − 1 p 1 = 0 (9) p_2^TK^{-T}t^{\wedge}RK^{-1}p_1=0 \tag{9} p2TKTtRK1p1=0(9)

公式8和公式9都称为对极约束,几何意义是 O 1 , P , O 2 O_1,P,O_2 O1P,O2三者共面,对极约束中同时包含了平移和旋转,并习惯把中间的部分记作两个矩阵:基础矩阵 F F FFundamental Matrix本质矩阵 E E EEssential Matrix
E = t ∧ R , F = K − T E K − 1 , x 2 T E x 1 = p 2 T F p 1 = 0 (10) E=t^{\wedge}R, \quad F=K^{-T}EK{-1}, \quad x_2^TEx_1=p_2^TFp_1=0 \tag{10} E=tR,F=KTEK1,x2TEx1=p2TFp1=0(10)
由于 E E E F F F只相差了相机内参,而内参在SLAM中一般是已知的,所以实践中往往使用更简单的 E E E,以下继续从 E = t ∧ R E=t^{\wedge}R E=tR,来解决相机位姿估计的问题

  1. 根据配对点的像素位置求出 E E E
  2. 根据 E E E求出 R , t R,t Rt

2 本质矩阵E

本质矩阵 E = t ∧ R E=t^{\wedge}R E=tR,是一个3*3的矩阵,内有9个未知数,从构造方式来看,本质矩阵有以下特性:

  • 本质矩阵是由对极约束定义的,由于对极约束是等式为零的约束,所以对E乘以任意非零常数后,对极约束依然满足,称为 E E E在不同尺度下是等价的,即尺度等价性
  • 根据 E = t ∧ R E=t^{\wedge}R E=tR,可证,本质矩阵 E E E的奇异值必定是 [ σ , σ , 0 ] T [\sigma, \sigma, 0]^T [σ,σ,0]T的形式,即本质矩阵的内在性质
  • 由于平移和旋转各有3个自由度,但由于尺度等价性,所以 E E E实际有5个自由度。

E E E实际有5个自由度,理论上最少可以用5对点来求解 E E E,但 E E E的内在性质是一种非线性性质,在估计时会带来麻烦,因此,可只考虑它的尺度等价性,使用8对点来估计 E E E,即经典的八点法(Eight point algorithm),八点法只利用 E E E线性性质,故可在线性代数下求解:

假设一对匹配点,它们的归一化坐标为 x 1 = [ u 1 , v 1 , 1 ] T , x 2 = [ u 2 , v 2 , 1 ] T x_1=[u_1, v_1, 1]^T, x_2=[u_2, v_2, 1]^T x1=[u1,v1,1]T,x2=[u2,v2,1]T,根据对极约束中的公式10,可得:

( u 2 , v 2 , 1 ) ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) ( u 1 v 1 1 ) = 0 (11) \begin{pmatrix} u_2, v_2, 1 \\ \end{pmatrix} \begin{pmatrix} e_1& e_2 & e_3\\ e_4& e_5 & e_6\\ e_7& e_8 & e_9 \end{pmatrix} \begin{pmatrix} u_1 \\ v_1 \\ 1 \\ \end{pmatrix}=0 \tag{11} (u2,v2,1) e1e4e7e2e5e8e3e6e9 u1v11 =0(11)
其中本质矩阵 E E E展开,写成向量的形式:
e = [ e 1 , e 2 , e 3 , e 4 , e 5 , e 6 , e 7 , e 8 , e 9 ] T e=[e_1, e_2, e_3, e_4, e_5, e_6, e_7, e_8, e_9]^T e=[e1,e2,e3,e4,e5,e6,e7,e8,e9]T

那么对极约束公式11可写成与 e e e有关的线性形式:
[ u 2 u 1 , u 2 v 1 , u 2 , v 2 u 1 , v 2 v 1 , v 2 , u 1 , v 1 , 1 ] ⋅ e = 0 (12) [u_2u_1,u_2v_1,u2,v_2u_1,v_2v_1,v_2,u_1,v_1,1]\cdot e=0 \tag{12} [u2u1,u2v1,u2,v2u1,v2v1,v2,u1,v1,1]e=0(12)

同理,八点法中的其他7个点也有相同的表示,8个点放到一个线性方程中,即:
( u 2 1 u 1 1 u 2 1 v 1 1 u 2 1 v 2 1 u 1 1 v 2 1 v 1 1 v 2 1 u 1 1 v 1 1 1 u 2 2 u 1 2 u 2 2 v 1 2 u 2 2 v 2 2 u 1 2 v 2 2 v 1 2 v 2 2 u 1 2 v 1 2 1 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ u 2 8 u 1 8 u 2 8 v 1 8 u 2 8 v 2 8 u 1 8 v 2 8 v 1 8 v 2 8 u 1 8 v 1 8 1 ) ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) = 0 (13) \begin{pmatrix} u_2^1u_1^1 & u_2^1v_1^1 & u_2^1 &v_2^1u_1^1 & v_2^1v_1^1 & v_2^1 & u_1^1 & v_1^1 & 1\\ u_2^2u_1^2 & u_2^2v_1^2 & u_2^2 &v_2^2u_1^2 & v_2^2v_1^2 & v_2^2 & u_1^2 & v_1^2 & 1 \\ \cdots & \cdots &\cdots &\cdots &\cdots &\cdots &\cdots &\cdots &\cdots \\ u_2^8u_1^8 & u_2^8v_1^8 & u_2^8 &v_2^8u_1^8 & v_2^8v_1^8 & v_2^8 & u_1^8 & v_1^8 & 1 \end{pmatrix} \begin{pmatrix} e_1 \\ e_2 \\ e_3 \\ e_4 \\ e_5 \\ e_6 \\ e_7 \\ e_8 \\ e_9 \end{pmatrix}=0 \tag{13} u21u11u22u12u28u18u21v11u22v12u28v18u21u22u28v21u11v22u12v28u18v21v11v22v12v28v18v21v22v28u11u12u18v11v12v18111 e1e2e3e4e5e6e7e8e9 =0(13)

该线性方程组的系数矩阵由特征点位置构成,大小为8*9 e e e位于该矩阵中的零空间中,如果系数矩阵是满秩(秩为8),那么零空间维数为1,即 e e e构成一条线,与本质矩阵 e e e的尺度等价性是一致的。

假设8对匹配点的矩阵满足秩为8,那么通过公式13即可求得本质矩阵 E E E

那么接下来的问题就是如何根据已经估算的本质矩阵 E E E,恢复出相机的运动姿态 R , t R,t Rt,这个过程用奇异值分解(SVD)求解的,假设 E E ESVD为:
E = U Σ V T (14) E=U\Sigma V^T \tag{14} E=UΣVT(14)
其中 U , V U,V U,V为正交阵, Σ \Sigma Σ为奇异值矩阵,根据 E E E的内在性质,可知 Σ = d i a g ( σ , σ , 0 ) \Sigma=diag(\sigma, \sigma, 0) Σ=diag(σ,σ,0),而在SVD分解中,对于任意一个 E E E,存在两个可能的 R , t R,t R,t与之对应:
t 1 ∧ = U R Z ( π 2 ) Σ U T , R 1 = U R Z T ( π 2 ) V T t 2 ∧ = U R Z ( − π 2 ) Σ U T , R 2 = U R Z T ( − π 2 ) V T (15) \begin{gather} t_1^{\wedge}=UR_Z(\frac{\pi}{2})\Sigma U^T, \quad R_1=UR_Z^T(\frac{\pi}{2})V^T \\ t_2^{\wedge}=UR_Z(-\frac{\pi}{2})\Sigma U^T, \quad R_2=UR_Z^T(-\frac{\pi}{2})V^T \end{gather} \tag{15} t1=URZ(2π)ΣUT,R1=URZT(2π)VTt2=URZ(2π)ΣUT,R2=URZT(2π)VT(15)
其中, R Z ( π 2 ) R_Z(\frac{\pi}{2}) RZ(2π)表示沿 Z Z Z轴旋转90°得到的旋转矩阵,同时,由于 − E -E E E E E等价,所以对任意一个 t t t取负号,也会得到同样的结果。因此,从 E E E分解到 R , t R,t Rt时,一共存在4个可能的解。

7-10形象地展示了分解本质矩阵得到的4个解。我们已知空间点在相机(蓝色线)上的 投影(红色点),想要求解相机的运动。在保持红色点不变的情况下,可以画出4种可能的情况。 不过幸运的是,只有第一种解中 P P P在两个相机中都具有正的深度。因此,只要把任意一点代入4 种解中检测该点在两个相机下的深度,就可以确定哪个解是正确的了。

请添加图片描述
剩下的一个问题是: 根据线性方程解出的 E E E, 可能不满足 E E E的内在性质,它的奇异值不 一定为 [ σ , σ , 0 ] [\sigma, \sigma, 0] [σ,σ,0]的形式。这时,我们会刻意地把 Σ \Sigma Σ矩阵调整成上面的样子。通常的做法是:对八点 法求得的 E E E进行SVD,会得到奇异值矩阵: E = d i a g ( σ 1 , σ 2 , σ 3 ) E = diag(\sigma1, \sigma2, \sigma3) E=diag(σ1,σ2,σ3), 不妨设 σ 1 > σ 2 > σ 3 \sigma1> \sigma2> \sigma3 σ1>σ2>σ3。取:
E = U d i a g ( σ 1 + σ 2 2 , σ 1 + σ 2 2 , 0 ) V T (16) E= Udiag(\frac{\sigma1+\sigma2}{2},\frac{\sigma1+\sigma2}{2},0)V^T \tag{16} E=Udiag(2σ1+σ2,2σ1+σ2,0)VT(16)
这相当于是把求出来的矩阵投影到了 E E E所在的流形上。当然, 更简单的做法是将奇异值矩阵取成 d i a g ( l , 1 , 0 ) diag(l, 1, 0) diag(l,1,0),因为 E E E具有尺度等价性,所以这样做也是合理的。

3 单应矩阵

除了基本矩阵和本质矩阵,二视图中还有一种常见的矩阵:单应矩阵 H H HHumography),它描述了两个平面之间的映射关系。

单应矩阵通常描述处于共同平面上的一些点在两张图像之间的变换关系,设图像 I 1 I_1 I1 I 2 I_2 I2 有一对匹配好的特征点 p 1 p_1 p1 p 2 p_2 p2,这个特征点落在平面 P P P上,设这个平面满足方程:

n T P + d = 0 (17) n^TP+d=0 \tag{17} nTP+d=0(17)

也即:
− n T P d = 1 (18) \frac{-n^TP}{d}=1 \tag{18} dnTP=1(18)

然后,结合公式2和公式3,得:
p 2 ≃ K ( R P + t ) ≃ K ( R P + t ) ⋅ − n T P d ≃ K ( R − t n T d ) P ≃ K ( R − t n T d ) K − 1 p 1 \begin{gather} p_2\simeq K(RP+t) \\ \simeq K(RP+t)\cdot\frac{-n^TP}{d} \\ \simeq K(R-\frac{tn^T}{d})P \\ \simeq K(R-\frac{tn^T}{d})K^{-1}p_1 \end{gather} p2K(RP+t)K(RP+t)dnTPK(RdtnT)PK(RdtnT)K1p1
于是,可得到一个直接描述图像坐标 p 1 p_1 p1 p 2 p_2 p2之间的变换,把中间这部分定义为单应矩阵 H H H,即:
p 2 ≃ H p 1 (19) p_2\simeq Hp_1 \tag{19} p2Hp1(19)
它的定义与旋转、平移及平面的参数有关。与基础矩阵 F F F类似,单应矩阵 H H H也是一个3*3的矩阵,求解时的思路和F类似, 同样可以先根据匹配点计算H,然后将它分解以计算旋转和平移。把上式展开,即:
( u 2 , v 2 , 1 ) ≃ ( h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 h 9 ) ( u 1 v 1 1 ) (20) \begin{pmatrix} u_2, v_2, 1 \\ \end{pmatrix}\simeq \begin{pmatrix} h_1& h_2 & h_3\\ h_4& h_5 & h_6\\ h_7& h_8 & h_9 \end{pmatrix} \begin{pmatrix} u_1 \\ v_1 \\ 1 \\ \end{pmatrix} \tag{20} (u2,v2,1) h1h4h7h2h5h8h3h6h9 u1v11 (20)
这里仍旧是尺度意义下的相等,所以H矩阵也可以乘以任意非零常数,实际处理可令h_9=1(在它取非零值时),然后根据第3行,去掉这个非零因子,可得:
u 2 = h 1 u 1 + h 2 v 1 + h 3 h 7 u 1 + h 8 v 1 + h 9 v 2 = h 4 u 1 + h 5 v 1 + h 6 h 7 u 1 + h 8 v 1 + h 9 \begin{gather} u_2=\frac{h_1u_1+h_2v_1+h_3}{h_7u_1+h_8v_1+h_9} \\ v_2=\frac{h_4u_1+h_5v_1+h_6}{h_7u_1+h_8v_1+h_9} \end{gather} u2=h7u1+h8v1+h9h1u1+h2v1+h3v2=h7u1+h8v1+h9h4u1+h5v1+h6
整理可得:
u 2 = h 1 u 1 + h 2 v 1 + h 3 − h 7 u 1 u 2 − h 8 v 1 u 2 v 2 = h 4 u 1 + h 5 v 1 + h 6 − h 7 u 1 v 2 − h 8 v 1 v 2 (21) \begin{gather} u_2=h_1u_1+h_2v_1+h_3-h_7u_1u_2-h_8v_1u_2 \\ v_2=h_4u_1+h_5v_1+h_6-h_7u_1v_2-h_8v_1v_2 \end{gather} \tag{21} u2=h1u1+h2v1+h3h7u1u2h8v1u2v2=h4u1+h5v1+h6h7u1v2h8v1v2(21)

这样,一组匹配点对就可以构造出两项约束(事实上有三个约束,但是因为线性相关, 只取前两个),于是自由度为8的单应矩阵可以通过4对匹配特征点算出(在非退化的情况下, 即这些特征点不能有三点共线的情况),即求解以下的线性方程组(当 h 9 = 0 h_9=0 h90时, 右侧为零):
( u 1 1 v 1 1 1 0 0 0 − u 1 1 u 2 1 − v 1 1 u 2 1 0 0 0 u 1 1 v 1 1 1 − u 1 1 v 2 1 − v 1 1 v 2 1 u 1 2 v 1 2 1 0 0 0 − u 1 2 u 2 2 − v 1 2 u 2 2 0 0 0 u 1 2 v 1 2 1 − u 1 2 v 2 2 − v 1 2 v 2 2 u 1 3 v 1 3 1 0 0 0 − u 1 3 u 2 3 − v 1 3 u 2 3 0 0 0 u 1 3 v 1 3 1 − u 1 3 v 2 3 − v 1 3 v 2 3 u 1 4 v 1 4 1 0 0 0 − u 1 4 u 2 4 − v 1 4 u 2 4 0 0 0 u 1 4 v 1 4 1 − u 1 4 v 2 4 − v 1 4 v 2 4 ) ( h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 ) = ( u 2 1 v 2 1 u 2 2 v 2 2 u 2 3 v 2 3 u 2 4 v 2 4 ) (22) \begin{pmatrix} u_1^1 & v_1^1 & 1 & 0 & 0 & 0 & -u_1^1u_2^1 & -v_1^1u_2^1\\ 0 & 0 & 0 & u_1^1 & v_1^1 & 1 & -u_1^1v_2^1 & -v_1^1v_2^1 \\ u_1^2 & v_1^2 & 1 & 0 & 0 & 0 & -u_1^2u_2^2 & -v_1^2u_2^2\\ 0 & 0 & 0 & u_1^2 & v_1^2 & 1 & -u_1^2v_2^2 & -v_1^2v_2^2 \\ u_1^3 & v_1^3 & 1 & 0 & 0 & 0 & -u_1^3u_2^3 & -v_1^3u_2^3\\ 0 & 0 & 0 & u_1^3 & v_1^3 & 1 & -u_1^3v_2^3 & -v_1^3v_2^3 \\ u_1^4 & v_1^4 & 1 & 0 & 0 & 0 & -u_1^4u_2^4 & -v_1^4u_2^4\\ 0 & 0 & 0 & u_1^4 & v_1^4 & 1 & -u_1^4v_2^4 & -v_1^4v_2^4 \end{pmatrix} \begin{pmatrix} h_1 \\ h_2 \\ h_3 \\ h_4 \\ h_5 \\ h_6 \\ h_7 \\ h_8 \end{pmatrix}=\begin{pmatrix} u_2^1 \\ v_2^1 \\ u_2^2 \\ v_2^2 \\ u_2^3 \\ v_2^3 \\ u_2^4 \\ v_2^4 \end{pmatrix} \tag{22} u110u120u130u140v110v120v130v140101010100u110u120u130u140v110v120v130v1401010101u11u21u11v21u12u22u12v22u13u23u13v23u14u24u14v24v11u21v11v21v12u22v12v22v13u23v13v23v14u24v14v24 h1h2h3h4h5h6h7h8 = u21v21u22v22u23v23u24v24 (22)
这种做法把 H H H矩阵看成了向量,通过解该向擞的线性方程来恢复 H H H,又称直接线性变换法(Direct Linear Transform, DLT)。与本质矩阵相似,求出单应矩阵后需要对其进行分解,才可以得到相应的 R , t R,t Rt,分解的方法包括数值法和解析法。与本质矩阵相似的分解类似,单应矩阵的分解同样会返回4组解,同时,可计算出它们分别对应的场景点所在平面的法向量。如果已知成像的地图点的深度全为正值(即在相机前方),则又可排除两组解,最后仅剩两组解,这时需要通过更多的先验信息进行判断。通常,可通过假设已知场景平面的法向量来解决,如场景平面与相机平面平行,那法向量 n n n的理论值为 1 T 1^T 1T

单应性在SLAM中具有重要意义。 当特征点共面或者相机发生纯旋转时,基础矩阵的自由度下降,这就出现了所谓的退化(degenerate)。现实中的数据总包含一些噪声,这时如果继续使用八点法求解基础矩阵,基础矩阵多余出来的自由度将会主要由噪声决定。为了能够避免退化现 象造成的影响,通常我们会同时估计基础矩阵F和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵(详细的案例可参考ORB-SLAM2中单目初始化Initializer)。


Reference:
-




须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/115049.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

烟草企业物流管理信息系统的分析与设计(论文+源码)_kaic

摘要 在经济高速发展的今天,物流业已经成为支撑国民经济的基础性产业。作为一种新型服务业,物流业集仓储、运输、信息等为一体,发展成为复合型战略性产业。S烟草企业设计的物流管理信息系统利用B/S模式的三层结构,基于JSP技术和J…

Django(9)-表单处理

django支持使用类创建表单实例 polls/forms.py from django import forms class NameForm(forms.Form):your_nameforms.CharField(label"Your name",max_length100)这个类创建了一个属性,定义了一个文本域,和它的label和最大长度。 polls/vi…

go语言kafka入门

消息队列:一种基于异步通信的解耦机制,用于在应用程序或系统组件之间传递消息和数据 消息队列相关概念: 生产者(Producer):生成并发送消息到消息队列中的应用程序或系统组件。 消费者(Consumer&…

微服务事务管理(Dubbo)

Seata 是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 一、示例架构说明 可在此查看本示例完整代码地址&#x…

【GO】LGTM_Grafana_Tempo(1)_架构

最近在尝试用 LGTM 来实现 Go 微服务的可观测性,就顺便整理一下文档。 Tempo 会分为 4 篇文章: Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架使用发送数据到 tempo 第一篇是关于,tempo 的架构&#xff…

0828|C++day6 菱形继承+虚继承+多态+抽象类+模板

一、思维导图 二、今日知识回顾 1&#xff09;多态 父类的指针或者引用&#xff0c;指向或初始化子类的对象&#xff0c;调用子类对父类重写的函数&#xff0c;进而展开子类的功能。 #include <iostream> using namespace std;class Zhou { private:string name;int age…

eclipse/STS(Spring Tool Suite)安装CDT环境(C/C++)

在线安装 help -> eclipse marketplace 可以发现&#xff0c;我所使用eclipse给我推荐安装的CDT是10.5版本 离线安装 下载离线安装包 下载地址&#xff1a;https://github.com/eclipse-cdt/cdt/blob/main/Downloads.md 可以看到利息安装包主要有如下四大类&#xff0c;…

【Kali Linux高级渗透测试】深入剖析Kali Linux:高级渗透测试技术与实践

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

(vue)Vue项目中使用jsPDF和html2canvas生成PDF

(vue)Vue项目中使用jsPDF和html2canvas生成PDF 效果&#xff1a; 安装与使用 1.&#xff1a;安装jsPDF和html2canvas npm install jspdf html2canvas2.在需要生成PDF文档的组件中引入jsPDF和html2canvas <template><div><el-button type"primary"…

Django(7)-项目实战-发布会签到管理系统

本文使用django实现一个简单的发布会签到管理系统 登录功能 模板页面 sign/templates/index.html <!DOCTYPE html> <html> <head><title>Login Page</title> </head> <body><h1>发布会管理</h1><form action=&qu…

视频融合平台EasyCVR视频汇聚平台关于小区高空坠物安全实施应用方案设计

近年来&#xff0c;随着我国城市化建设的推进&#xff0c;高楼大厦越来越多&#xff0c;高空坠物导致的伤害也屡见不鲜&#xff0c;严重的影响到人们的生命安全。像在日常生活中一些不起眼的小东西如烟头、鸡蛋、果核、易拉罐&#xff0c;看似伤害不大&#xff0c;但只要降落的…

无涯教程-Android - DatePicker函数

Android Date Picker允许您在自定义用户界面中选择由日,月和年组成的日期。为此功能,android提供了DatePicker和DatePickerDialog组件。 在本教程中,我们将通过DatePickerDialog演示日期选择器的用法, DatePickerDialog是一个包含DatePicker的简单对话框。 为了显示DatePicker…

RTSP/Onvif视频服务器EasyNVR安防视频平台服务器频繁重启的问题解决方案

EasyNVR平台优秀的视频能力在于通过RTSP/ONVIF协议&#xff0c;将前端接入设备的音视频资源进行采集&#xff0c;并转码成适合全平台、全终端分发的视频流格式&#xff0c;包括RTSP、RTMP、FLV、HLS、WebRTC等格式。平台可拓展性强、部署轻快&#xff0c;在安防监控领域有着广泛…

决策树(Decision Tree)

决策树的定义: 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点&#xff08;node&#xff09;和有向边&#xff08;directed edge&#xff09;组成。结点有两种类型: 内部结点&#xff08;internal node&#xff09;和叶结点&#xff08;leaf node&#xff0…

Linux的内存理解

建议 Mysql机器 尽量不要硬swap,如果是ssd磁盘还好。Free命令 free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存 输出简介: Mem 行(第二行)是内存的使用情况。Swap 行(第三行)是交换空间的使用情况。total 列显示系统总的可用物理内存和交换…

curl通过webdav操作alist

创建目录: url202320230828;curl -v -u "admin":"这里是密码" -X MKCOL "http://127.0.0.1:5244/dav/my189tianyi/${url2023}/" 上传文件: curl -v -u "admin":"这里是密码" -T /tmp/aa.json "http://127.0.0.1:52…

Android Activity 启动流程 二:setContentView

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、概览二、setContentView&#xff08;&#xff09;三…

springboot集成es 插入和查询的简单使用

第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version></dependency>第二步&#xff1a;…

iTOP-RK3588开发板Android12 设置系统默认不休眠

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - <integer name"def_screen_off_timeout">60000</integer> <integer name&q…

什么是同源策略(same-origin policy)?它对AJAX有什么影响?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 同源策略&#xff08;Same-Origin Policy&#xff09;与 AJAX 影响⭐ 同源策略的限制⭐ AJAX 请求受同源策略影响⭐ 跨域资源共享&#xff08;CORS&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记…