【三维重建】ePnP

PnP问题应用与一下场景:
已知三维点和对应二维点以及相机相机内参数,可以获取相机外参。请添加图片描述
我们介绍其中的一种算法:ePnP

算法流程

1、ePnP算法首先在世界坐标系内寻找4个控制点,记作 C 1 w , C 2 w , C 3 w , C 4 w C_1^w,C_2^w,C_3^w,C_4^w C1w,C2w,C3w,C4w,使得:
对于世界坐标系内任意一点 P 1 w , P_1^w, P1w,存在对应的 α i = [ α i 1 , α i 2 , α i 3 , α i 4 ] T \alpha_i=[\alpha_{i1},\alpha_{i2},\alpha_{i3},\alpha_{i4}]^T αi=[αi1,αi2,αi3,αi4]T,满足:
P i w = ∑ j = 1 4 α i j C j w , w i t h ∑ j = 1 4 α i j = 1 P_i^w = \sum_{j=1}^4\alpha_{ij}C_j^w, {\kern 20pt} with\sum_{j=1}^4\alpha_{ij}=1 Piw=j=14αijCjw,withj=14αij=1
世界坐标系上的 P w P^w Pw 经过 R , t R,t R,t 变换可以得到相机坐标系下的点 P c P^c Pc :
P i c = R P i w + t = R ( ∑ j = 1 4 α i j C j w ) + t P_i^c = RP_i^w+t=R\left(\sum_{j=1}^4\alpha_{ij}C_j^w\right) + t Pic=RPiw+t=R(j=14αijCjw)+t
由于 ∑ j = 1 4 α i j = 1 \sum_{j=1}^4\alpha_{ij}=1 j=14αij=1,因此 t = ∑ j = 1 4 α i j t t=\sum_{j=1}^4\alpha_{ij}t t=j=14αijt 带入上式得 ( C j w 是世界坐标系下的控制点, C j c 是世界坐标系下的控制点 ) (C_j^w是世界坐标系下的控制点,C_j^c是世界坐标系下的控制点) (Cjw是世界坐标系下的控制点,Cjc是世界坐标系下的控制点):
P i c = ∑ j − 1 4 α i j ( R C j w + t ) = ∑ j − 1 4 α i j C j c , ( C j c = R C j w + t ) P_i^c = \sum_{j-1}^4\alpha_{ij}(RC_j^w + t)= \sum_{j-1}^4\alpha_{ij}C_j^c,{\color{red} \left(C_j^c = RC_j^w+t \right)} Pic=j14αij(RCjw+t)=j14αijCjc,(Cjc=RCjw+t)

通过内参矩阵,建立相机坐标系下的点 P c P^c Pc 到像素坐标系下的点 p p p 的映射:
p i = s i [ u i v i 1 ] = K P i c = [ f u 0 u c 0 f v v c 0 0 1 ] ∑ j = 1 4 α i j [ C x j c C y j c C z j c ] p_i = s_i\begin{bmatrix}u_i \\ v_i \\ 1 \end{bmatrix} = KP^c_i=\begin{bmatrix}f_u &0 & u_c \\0& f_v & v_c \\ 0&0&1 \end{bmatrix}\sum_{j=1}^4\alpha_{ij}\begin{bmatrix}C_{xj}^c \\C_{yj}^c \\ C_{zj}^c \end{bmatrix} pi=si uivi1 =KPic= fu000fv0ucvc1 j=14αij CxjcCyjcCzjc
将公式展开,可得:
∑ j = 1 4 α i j f u C x j c + α i j ( u c − u i ) C z j c = 0 ∑ j = 1 4 α i j f v C y j c + α i j ( v c − v i ) C z j c = 0 \sum_{j=1}^4\alpha_{ij}f_uC^c_{xj} + \alpha_{ij}(u_c-u_i)C_{zj}^c = 0 \\ \sum_{j=1}^4\alpha_{ij}f_vC^c_{yj} + \alpha_{ij}(v_c-v_i)C_{zj}^c = 0 j=14αijfuCxjc+αij(ucui)Czjc=0j=14αijfvCyjc+αij(vcvi)Czjc=0
对于上述公式 只有相机坐标系下的四个控制点 C j c C_j^c Cjc​ 未知,每个控制点有三个参数,因此一共有12个未知数。每对点能建立两个方程组,所以,至少要6对点才能进行求解。
f u [ α i 1 α i 2 α i 3 α i 4 ] [ C x 1 c C x 2 c C x 3 c C x 4 c ] + ( u c − u i ) [ α i 1 α i 2 α i 3 α i 4 ] [ C z 1 c C z 2 c C z 3 c C z 4 c ] = 0 f v [ α i 1 α i 2 α i 3 α i 4 ] [ C y 1 c C y 2 c C y 3 c C y 4 c ] + ( v c − v i ) [ α i 1 α i 2 α i 3 α i 4 ] [ C z 1 c C z 2 c C z 3 c C z 4 c ] = 0 [ f u α i 1 f u α i 2 f u α i 3 f u α i 4 0 0 0 0 ( u c − u i ) α i 1 ( u c − u i ) α i 2 ( u c − u i ) α i 3 ( u c − u i ) α i 4 0 0 0 0 f v α i 1 f v α i 2 f v α i 3 f v α i 4 ( v c − v i ) α i 1 ( v c − v i ) α i 2 ( v c − v i ) α i 3 ( v c − v i ) α i 4 ] [ C x 1 c C x 2 c C x 3 c C x 4 c C y 1 c C y 2 c C y 3 c C y 4 c C z 1 c C z 2 c C z 3 c C z 4 c ] = 0 f_u \begin{bmatrix} \alpha_{i1} & \alpha_{i2} & \alpha_{i3} & \alpha_{i4} \end{bmatrix}\begin{bmatrix} C_{x1}^c \\ C_{x2}^c \\ C_{x3}^c \\ C_{x4}^c\end{bmatrix} + (u_c-u_i) \begin{bmatrix} \alpha_{i1} & \alpha_{i2} & \alpha_{i3} & \alpha_{i4} \end{bmatrix} \begin{bmatrix} C_{z1}^c \\ C_{z2}^c \\ C_{z3}^c \\ C_{z4}^c\end{bmatrix} =0 \\ f_v \begin{bmatrix} \alpha_{i1} & \alpha_{i2} & \alpha_{i3} & \alpha_{i4} \end{bmatrix}\begin{bmatrix} C_{y1}^c \\ C_{y2}^c \\ C_{y3}^c \\ C_{y4}^c\end{bmatrix} + (v_c-v_i) \begin{bmatrix} \alpha_{i1} & \alpha_{i2} & \alpha_{i3} & \alpha_{i4} \end{bmatrix} \begin{bmatrix} C_{z1}^c \\ C_{z2}^c \\ C_{z3}^c \\ C_{z4}^c\end{bmatrix} =0 \\\\\\ \begin{bmatrix} f_u\alpha_{i1} & f_u\alpha_{i2} & f_u\alpha_{i3} & f_u\alpha_{i4} &0&0&0&0&(u_c-u_i) \alpha_{i1} & (u_c-u_i) \alpha_{i2} & (u_c-u_i) \alpha_{i3} & (u_c-u_i) \alpha_{i4} \\0&0&0&0&f_v\alpha_{i1} & f_v\alpha_{i2} & f_v\alpha_{i3} & f_v\alpha_{i4}& (v_c-v_i) \alpha_{i1} & (v_c-v_i) \alpha_{i2} & (v_c-v_i) \alpha_{i3} & (v_c-v_i) \alpha_{i4} \end{bmatrix}\begin{bmatrix}C_{x1}^c \\ C_{x2}^c \\ C_{x3}^c \\ C_{x4}^c\\C_{y1}^c \\ C_{y2}^c \\ C_{y3}^c \\ C_{y4}^c \\ C_{z1}^c \\ C_{z2}^c \\ C_{z3}^c \\ C_{z4}^c\end{bmatrix} =0 fu[αi1αi2αi3αi4] Cx1cCx2cCx3cCx4c +(ucui)[αi1αi2αi3αi4] Cz1cCz2cCz3cCz4c =0fv[αi1αi2αi3αi4] Cy1cCy2cCy3cCy4c +(vcvi)[αi1αi2αi3αi4] Cz1cCz2cCz3cCz4c =0[fuαi10fuαi20fuαi30fuαi400fvαi10fvαi20fvαi30fvαi4(ucui)αi1(vcvi)αi1(ucui)αi2(vcvi)αi2(ucui)αi3(vcvi)αi3(ucui)αi4(vcvi)αi4] Cx1cCx2cCx3cCx4cCy1cCy2cCy3cCy4cCz1cCz2cCz3cCz4c =0
找到相机坐标系下的控制点后,就能够求得相机外参:
C j c = R C j w + t [ C x j c C y j c C z j c ] = [ r 1 r 2 r 3 r 4 r 5 r 6 r 7 r 8 r 9 ] [ C x j w C y j w C z j w ] + [ t 1 t 2 t 3 ] C x j c = r 1 C x j w + r 2 C y j w + r 3 C z j w + t 1 C y j c = r 4 C x j w + r 5 C y j w + r 6 C z j w + t 2 C z j c = r 7 C x j w + r 8 C y j w + r 9 C z j w + t 3 [ C x 1 c C y 1 c C z 1 c C x 2 c C y 2 c C z 2 c C x 3 c C y 3 c C z 3 c C x 4 c C y 4 c C z 4 c ] = [ C x 1 w C y 1 w C z 1 w 0 0 0 0 0 0 1 0 0 0 0 0 C x 1 w C y 1 w C z 1 w 0 0 0 0 1 0 0 0 0 0 0 0 C x 1 w C y 1 w C z 1 w 0 0 1 C x 2 w C y 2 w C z 2 w 0 0 0 0 0 0 1 0 0 0 0 0 C x 2 w C y 2 w C z 2 w 0 0 0 0 1 0 0 0 0 0 0 0 C x 2 w C y 2 w C z 2 w 0 0 1 C x 3 w C y 3 w C z 3 w 0 0 0 0 0 0 1 0 0 0 0 0 C x 3 w C y 3 w C z 3 w 0 0 0 0 1 0 0 0 0 0 0 0 C x 3 w C y 3 w C z 3 w 0 0 1 C x 4 w C y 4 w C z 4 w 0 0 0 0 0 0 1 0 0 0 0 0 C x 4 w C y 4 w C z 4 w 0 0 0 0 1 0 0 0 0 0 0 0 C x 4 w C y 4 w C z 4 w 0 0 1 ] [ r 1 r 2 r 3 r 4 r 5 r 6 r 7 r 8 r 9 t 1 t 2 t 3 ] \begin{aligned} &C_j^c = RC_j^w+t\\\\ &\begin{bmatrix}C_{xj}^c \\ C_{yj}^c \\ C_{zj}^c \end{bmatrix} = \begin{bmatrix} r_1 & r_2 & r_3 \\ r_4 & r_5 & r_6 \\r_7 & r_8 & r_9 \end{bmatrix}\begin{bmatrix}C_{xj}^w \\ C_{yj}^w \\ C_{zj}^w \end{bmatrix} + \begin{bmatrix} t_1 \\ t_2 \\ t_3\end{bmatrix} \\\\ &C_{xj}^c = r_1C_{xj}^w + r_2C_{yj}^w + r_3C_{zj}^w + t_1\\ &C_{yj}^c = r_4C_{xj}^w + r_5C_{yj}^w + r_6C_{zj}^w + t_2\\ &C_{zj}^c = r_7C_{xj}^w + r_8C_{yj}^w + r_9C_{zj}^w + t_3\\ \\\\ &\begin{bmatrix}C_{x1}^c \\ C_{y1}^c \\C_{z1}^c \\C_{x2}^c \\ C_{y2}^c \\C_{z2}^c \\C_{x3}^c \\ C_{y3}^c \\C_{z3}^c \\C_{x4}^c \\ C_{y4}^c \\C_{z4}^c\end{bmatrix} = \begin{bmatrix} C_{x1}^w & C_{y1}^w & C_{z1}^w&0&0&0&0&0&0&1&0&0 \\ 0&0&0&C_{x1}^w & C_{y1}^w & C_{z1}^w &0&0&0&0&1&0\\ 0&0&0&0&0&0& C_{x1}^w & C_{y1}^w & C_{z1}^w &0&0&1\\ C_{x2}^w & C_{y2}^w & C_{z2}^w&0&0&0&0&0&0&1&0&0 \\ 0&0&0&C_{x2}^w & C_{y2}^w & C_{z2}^w &0&0&0&0&1&0\\ 0&0&0&0&0&0& C_{x2}^w & C_{y2}^w & C_{z2}^w &0&0&1 \\ C_{x3}^w & C_{y3}^w & C_{z3}^w&0&0&0&0&0&0&1&0&0 \\ 0&0&0&C_{x3}^w & C_{y3}^w & C_{z3}^w &0&0&0&0&1&0\\ 0&0&0&0&0&0& C_{x3}^w & C_{y3}^w & C_{z3}^w &0&0&1\\ C_{x4}^w & C_{y4}^w & C_{z4}^w&0&0&0&0&0&0&1&0&0 \\ 0&0&0&C_{x4}^w & C_{y4}^w & C_{z4}^w &0&0&0&0&1&0\\ 0&0&0&0&0&0& C_{x4}^w & C_{y4}^w & C_{z4}^w &0&0&1 \end{bmatrix} \begin{bmatrix}r_1 \\ r_2 \\ r_3 \\ r_4 \\ r_5 \\ r_6 \\ r_7 \\ r_8 \\ r_9 \\t_1\\t_2\\t_3 \end{bmatrix} \end{aligned} Cjc=RCjw+t CxjcCyjcCzjc = r1r4r7r2r5r8r3r6r9 CxjwCyjwCzjw + t1t2t3 Cxjc=r1Cxjw+r2Cyjw+r3Czjw+t1Cyjc=r4Cxjw+r5Cyjw+r6Czjw+t2Czjc=r7Cxjw+r8Cyjw+r9Czjw+t3 Cx1cCy1cCz1cCx2cCy2cCz2cCx3cCy3cCz3cCx4cCy4cCz4c = Cx1w00Cx2w00Cx3w00Cx4w00Cy1w00Cy2w00Cy3w00Cy4w00Cz1w00Cz2w00Cz3w00Cz4w000Cx1w00Cx2w00Cx3w00Cx4w00Cy1w00Cy2w00Cy3w00Cy4w00Cz1w00Cz2w00Cz3w00Cz4w000Cx1w00Cx2w00Cx3w00Cx4w00Cy1w00Cy2w00Cy3w00Cy4w00Cz1w00Cz2w00Cz3w00Cz4w100100100100010010010010001001001001 r1r2r3r4r5r6r7r8r9t1t2t3

控制点选取

原则上,就是只要选择3个线性无关的点,就可以表示任意一个三维点,但由于方程组是4,如何是3个控制点只能求得最小二乘解。论文中给出了具体的选择方法。 3D参考点集为 { P i w , i = 1 , ⋯   , n } \left\{P^w_i,i=1,\cdots,n \right \} {Piw,i=1,,n}, 选择3D点的中心为第一个控制点:
C 1 w = 1 n ∑ i = 1 n P i w C^w_1=\frac{1}{n}\sum_{i=1}^nP^w_i C1w=n1i=1nPiw
进而得到矩阵:
A = [ ( P 1 w ) T − ( C 1 w ) T ⋯ ( P n w ) T − ( C n w ) T ] A=\begin{bmatrix}{(P_{1}^{w})}^{T} - {(C_{1}^{w})}^{T} \\ \cdots \\ {(P_{n}^{w})}^{T} - {(C_{n}^{w})}^{T} \end{bmatrix} A= (P1w)T(C1w)T(Pnw)T(Cnw)T
A T A A^TA ATA的特征值为 λ i \lambda_i λi, 特征向量为 V i V_i Vi ,那么剩下的三个点为:
C w = C 1 w + λ i 1 2 V i ,   i = 1 , 2 , 3 C^w = C_1^w +\lambda^{\frac{1}{2}}_iV_i,\ i = 1,2,3 Cw=C1w+λi21Vi, i=1,2,3

求解 α \alpha α

联立方程组:
P i w = α i 1 C 1 w + α i 2 C 2 w + α i 3 C 3 w + α i 4 C 4 w [ x i y i z i ] = α i 1 [ C x 1 w C y 1 w C z 1 w ] + α i 2 [ C x 2 w C y 2 w C z 2 w ] + α i 3 [ C x 3 w C y 3 w C z 3 w ] + α i 4 [ C x 4 w C y 4 w C z 4 w ] \begin{aligned} &P_i^w = \alpha_{i1}C_1^w+\alpha_{i2}C_2^w+\alpha_{i3}C_3^w+\alpha_{i4}C_4^w \\\\ &\begin{bmatrix} x_i \\y_i\\z_i\end{bmatrix} = \alpha_{i1}\begin{bmatrix} C_{x1}^w \\C_{y1}^w\\C_{z1}^w\end{bmatrix}+\alpha_{i2}\begin{bmatrix} C_{x2}^w \\C_{y2}^w\\C_{z2}^w\end{bmatrix}+\alpha_{i3}\begin{bmatrix} C_{x3}^w \\C_{y3}^w\\C_{z3}^w\end{bmatrix}+\alpha_{i4}\begin{bmatrix} C_{x4}^w \\C_{y4}^w\\C_{z4}^w\end{bmatrix} \end{aligned} Piw=αi1C1w+αi2C2w+αi3C3w+αi4C4w xiyizi =αi1 Cx1wCy1wCz1w +αi2 Cx2wCy2wCz2w +αi3 Cx3wCy3wCz3w +αi4 Cx4wCy4wCz4w
每个点可以得到4个方程组:
x i = α i 1 C x 1 w + α i 2 C x 2 w + α i 3 C x 3 w + α i 4 C x 4 w y i = α i 1 C y 1 w + α i 2 C y 2 w + α i 3 C y 3 w + α i 4 C y 4 w z i = α i 1 C z 1 w + α i 2 C z 2 w + α i 3 C z 3 w + α i 4 C z 4 w 1 = α i 1 + α i 2 + α i 3 + α i 4 x_i=\alpha_{i1}C_{x1}^w+\alpha_{i2}C_{x2}^w+\alpha_{i3}C_{x3}^w+\alpha_{i4}C_{x4}^w\\ y_i=\alpha_{i1}C_{y1}^w+\alpha_{i2}C_{y2}^w+\alpha_{i3}C_{y3}^w+\alpha_{i4}C_{y4}^w\\ z_i=\alpha_{i1}C_{z1}^w+\alpha_{i2}C_{z2}^w+\alpha_{i3}C_{z3}^w+\alpha_{i4}C_{z4}^w\\ 1= \alpha_{i1}+\alpha_{i2}+\alpha_{i3}+\alpha_{i4} xi=αi1Cx1w+αi2Cx2w+αi3Cx3w+αi4Cx4wyi=αi1Cy1w+αi2Cy2w+αi3Cy3w+αi4Cy4wzi=αi1Cz1w+αi2Cz2w+αi3Cz3w+αi4Cz4w1=αi1+αi2+αi3+αi4
用矩阵的方式可表示为:
[ x i y i z i 1 ] = [ C x 1 w C x 2 w C x 3 w C x 4 w C y 1 w C y 2 w C y 3 w C y 4 w C z 1 w C z 2 w C z 3 w C z 4 w 1 1 1 1 ] [ α i 1 α i 2 α i 3 α i 4 ] ⟶ [ C x 1 w C x 2 w C x 3 w C x 4 w C y 1 w C y 2 w C y 3 w C y 4 w C z 1 w C z 2 w C z 3 w C z 4 w 1 1 1 1 ] − 1 [ x i y i z i 1 ] = [ α i 1 α i 2 α i 3 α i 4 ] \begin{bmatrix} x_i \\ y_i \\ z_i \\ 1 \end{bmatrix} = \begin{bmatrix} C_{x1}^w &C_{x2}^w &C_{x3}^w &C_{x4}^w \\ C_{y1}^w &C_{y2}^w &C_{y3}^w &C_{y4}^w \\ C_{z1}^w &C_{z2}^w &C_{z3}^w &C_{z4}^w \\ 1&1&1&1 \end{bmatrix} \begin{bmatrix} \alpha_{i1} \\ \alpha_{i2} \\ \alpha_{i3} \\ \alpha_{i4}\end{bmatrix} \longrightarrow \begin{bmatrix} C_{x1}^w &C_{x2}^w &C_{x3}^w &C_{x4}^w \\ C_{y1}^w &C_{y2}^w &C_{y3}^w &C_{y4}^w \\ C_{z1}^w &C_{z2}^w &C_{z3}^w &C_{z4}^w \\ 1&1&1&1 \end{bmatrix} ^{-1}\begin{bmatrix} x_i \\ y_i \\ z_i \\ 1 \end{bmatrix} = \begin{bmatrix} \alpha_{i1} \\ \alpha_{i2} \\ \alpha_{i3} \\ \alpha_{i4}\end{bmatrix} xiyizi1 = Cx1wCy1wCz1w1Cx2wCy2wCz2w1Cx3wCy3wCz3w1Cx4wCy4wCz4w1 αi1αi2αi3αi4 Cx1wCy1wCz1w1Cx2wCy2wCz2w1Cx3wCy3wCz3w1Cx4wCy4wCz4w1 1 xiyizi1 = αi1αi2αi3αi4

C++代码实现:https://github.com/ldx-star/ePnP

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Laravel和ThinkPHP框架比较

一、开发体验与易用性比较 1. 代码可读性: - Laravel以其优雅的语法和良好的代码结构著称,使得代码更加易读易懂。 - 相比之下,ThinkPHP的代码可读性较为一般,在一些复杂业务场景下,可能会稍显混乱。 让您能够一站式…

每天写两道(一):无重复字符的最长子串、反转链表

3. 无重复字符的最长子串 3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。(1)滑动窗口 双…

Web安全:文件上传漏洞详解,文件上传漏洞原理、绕过方式和防御方案。

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等…

搭建服务器的主流中间件有哪些?如何在外网访问内网的服务?

计算机业内人士对于搭建服务器的中间件并不陌生,apache、tomcat、IIS、nginx 都是比较常用的搭建服务器的中间件,它们之间还是有一些区别差异的。今天就说说这些中间件之间有哪些区别,以及如何利用快解析实现内网主机应用让外网访问。 首先说…

c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?

当将指针转换为void后,擦除了指针所指向对象的类型信息,因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个…

【状态机动态规划】3129. 找出所有稳定的二进制数组 I

本文涉及知识点 动态规划汇总 LeetCode 3129. 找出所有稳定的二进制数组 I 给你 3 个正整数 zero ,one 和 limit 。 一个 二进制数组 arr 如果满足以下条件,那么我们称它是 稳定的 : 0 在 arr 中出现次数 恰好 为 zero 。 1 在 arr 中出现…

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…

【leetcode 141】环形链表——快慢指针(龟兔赛跑)

给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(…

如何使用Spring Cache优化后端接口?

Spring Cache是Spring框架提供的一种缓存抽象,它可以很方便地集成到应用程序中,用于提高接口的性能和响应速度。使用Spring Cache可以避免重复执行耗时的方法,并且还可以提供一个统一的缓存管理机制,简化缓存的配置和管理。 本文将详细介绍如何使用Spring Cache来优化接口,…

【Java】JavaSE概述

1、简介 Java SE(Java Platform, Standard Edition)是Java技术的核心平台,它提供了Java编程语言、Java虚拟机(JVM)以及Java核心类库和API。Java SE主要用于开发和部署桌面应用程序、服务器应用程序、命令行工具和嵌入…

kkFileView——全能的在线文件预览解决方案

引言 在数字化办公日益普及的今天,文件的在线预览成为了一个不可或缺的功能。无论是个人还是企业,都希望能够在浏览器中直接打开并浏览各种格式的文档。今天,我们将探索一款国产开源免费的在线文件文档预览软件——kkFileView。 一、kkFile…

Pag格式在vue3中的简单使用方法

目前前端使用pag格式的方法比较少&#xff0c; 在这里我来简单实现一下pag格式在vue3中的使用方式。 第一步 先下载啦 npm i libpag 来对pag文件安装依赖 其次我们在自己想要引入的vue页面进行引入 <script setup> import { ref, computed, watchEffect, nextTick …

【设计模式深度剖析】【4】【结构型】【组合模式】| 以文件系统为例加深理解

&#x1f448;️上一篇:适配器模式 | 下一篇:桥接模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 目 录 组合模式定义英文原话直译如何理解&#xff1f; 3个角色UML类图代码示例 组合模式的优点组合模式的使用场景示例解析&#xff1a;文件系统 组合模式 组合模式&a…

C#子窗体嵌入主窗体

上位机开发中&#xff0c;经常会需要将子窗体嵌入到主窗体。 运行结果 核心实现&#xff1a; private void button2_Click(object sender, EventArgs e){Form3 childForm new Form3();//判断容器中是否已经打开子窗体&#xff0c;如果打开现将其关闭foreach (Control item in…

磐启PAN2013 2.4GHz无线收发SOC

PAN2013是一款集成了8位MCU和2568bits EEPROM的无线收发SoC芯片。该芯片工作2.400~2.483GHz世界通用ISM频段&#xff0c;且集成射频收发机、频率发生器、晶体振荡器、调制解调器和低功耗MCU等功能模块&#xff0c;并且支持一对多组网和带ACK的通信模式。 用户通过MCU的I/O口向…

虚拟化平台之Proxmox VE 安装

介绍 Proxmox VE是一种基于Debian Linux和KVM的虚拟化平台&#xff0c;也可称之为Proxmox Virtual Environment。 Proxmox VE具有非常友好的用户界面&#xff0c;基于JAVA的UI和内核接口&#xff0c;方便用户登录到VM客户进行操作&#xff0c;还具有易用的模板功能&#xff0…

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…

【Leetcode 160】环形链表——双指针,细节讲解

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.互联网的核心岗位以及职…