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.mzph.cn/news/62368.shtml

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

相关文章

高效使用WMS仓储管理系统,需要关注这八个点

在现代供应链中,WMS仓储管理系统扮演着至关重要的角色。然而,随着供应链需求的不断增长和变化,实施WMS仓储管理系统面临着越来越多的挑战和要求。本文将探讨使用WMS仓储管理系统需要考虑的8大因素,以适应现代供应链的需求。 一、W…

树和二叉树基础

引言: 树是一种非线性的结构,也是由一个一个的结点构成。 树的一些基本概念: 节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的度为6 叶节点或终端节点:度为0的节点称为叶节点。…

优秀的ui设计作品(合集)

UI设计师需要了解的九个Tips 1.图片类APP排版突破 规则是死的,人是活的。很多时候,如果需求是比较宽要尝试突破原则,用一些另类的排版方式,其实也是做好设计的本质。在图片类app中,错落一些的排版会使你的作品更有魅力…

Metinfo6.0.0任意文件读取漏洞复现

漏洞原理 在\MetInfo6.0.0\app\system\include\module\的old_thumb.class.php文件 可以看到这里对./进行了严格的过滤,但是却忽略了在Windows下还可以用…\来跳转目录 环境搭建 下载Metinfo6.0.0 配置随便写,自己记住就行 这里前面已经审计过代码了&a…

基于YOLOv8分割模型实现垃圾识别

基于YOLOv8分割模型实现垃圾识别 本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 YOLOv8是Ultralytics开源的一个非常火的AI算法,目前支持目标检测、实例分割、姿态估计等任务。如果对YOLOv8的安装和使用还不了解的可以参考我之前写的这篇文章&am…

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

基于java swing和mysql实现的电影票购票管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的电影票购票管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…

PHP小白搭建Kafka环境以及初步使用rdkafka

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装java&#xff08;Kafka必须安装java&#xff0c;因为kafka依赖java核心&#xff09;二、安装以及配置Kafka、zookeeper1.下载Kafka&#xff08;无需下载…

26 Linux高级篇-Linux面试题

26 Linux高级篇-Linux面试题 文章目录 26 Linux高级篇-Linux面试题1.分析日志t.txt(访问量)&#xff0c;将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾讯)2.统计连接到服务器的各个ip情况&#xff0c;并按连接数从大到小排序(腾讯)3.如忘记了mys…

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

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

基于java Swing 和 mysql实现的购物管理系统(源码+数据库+说明文档+运行指导视频)

一、项目简介 本项目是一套基于java Swing 和 mysql实现的购物管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想

Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想 文章目录 Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想STL 容器特点推行自己的容器容器能力的交集 封装Method1: typedefMethod2: class>>>>> 欢迎关注公众号【三戒纪元】…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

微信小程序 - 2023年最新版手机号快捷登录详细教程

前言 最近开发公司手机快捷登录的功能&#xff0c;花费了不少时间&#xff0c;这里附上详细教程。 这里以海底捞小程序的图片为例&#xff0c;如有侵权请联系小编删除。 代码如下 <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"…

oracle 基础运用2

首先在电脑上安装PLSQL developer&#xff0c;这个是oracle图形化连接工具&#xff0c;然后安装win64_11gR2_client&#xff0c;这个是orace客户端&#xff0c;安装完成后可以在cmd命令行输入sqlplus命令进行验证&#xff0c;如图表示安装成功。 作为sys的连接应该是SySDBA或Sy…

万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

众所周知&#xff0c;C 是一门自由的语言&#xff0c;语言的设计哲学之一就是赋予程序员极大的自由度和灵活性&#xff0c;因此&#xff0c;使用C 完成一个任务时&#xff0c;不同的程序员往往会有不同的实现方法&#xff0c;这真正阐释了什么叫条条大路通罗马。不过&#xff0…

Android Activity 启动流程 二:setContentView

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

阿桂天山的技术小结:Flask+UEditor实现图片文件上传富文本编辑

话不多说,有图有源码 先看效果: 1.前端html页面index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><script src"{{ url_for(static,filenameueditor/ueditor.config.js) }}"></script…

说说Flink中的State

分析&回答 基本类型划分 在Flink中&#xff0c;按照基本类型&#xff0c;对State做了以下两类的划分&#xff1a; Keyed State&#xff0c;和Key有关的状态类型&#xff0c;它只能被基于KeyedStream之上的操作&#xff0c;方法所使用。我们可以从逻辑上理解这种状态是一…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…