PnP算法详解

  • PnP概述
  • PnP数学模型
  • PnP求解方法
    • DLT直接线性变换法
    • EPnP
      • EPnP的特点
      • 步骤
      • 理论推倒
        • 1.控制点及齐次重心坐标系
        • 2.控制点的选择
        • 3.计算控制点在相机坐标系下的坐标
        • 4.求解R,t(ICP方法)
  • 参考文章

博主缺粉丝希望大家能给个关注!!!

PnP概述

PnP(Perspective-n-Point)是求解3D到2D点的对应方法。它描述了当知道n个3D空间点及其位置,如何估计相机的位姿。如果两张图像中的一张特征点3D位置已知,那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。

  • PnP的应用范围很广比如两阶段法的6D姿态估计以及视觉SLAM等等。
  • 特征点的3D位置可以由三角化或者RGB-D相机的深度图确定,当然还有其他方法。

PnP数学模型

PnP问题的几何结构如下图所示,给定3D点的坐标以及对应2D点的坐标以及内参矩阵,求解相机的姿态。

已知:n个点在世界坐标系下的坐标P1P_{1}P1​、P2P_{2}P2​、…、PiP_{i}Pi​、…、PnP_{n}Pn​
  对应像素的坐标p1p_{1}p1​、p2p_{2}p2​、…、pip_{i}pi​、…、pnp_{n}pn​
  相机内参KKK
求解:相机坐标系(OcXcYcZcO_{c}X_{c}Y_{c}Z_{c}Oc​Xc​Yc​Zc​)相对于世界坐标系(OwXwYwZwO_{w}X_{w}Y_{w}Z_{w}Ow​Xw​Yw​Zw​)的位姿,公式中(1)中的[R t]
[XcYcZc]=[Rt][XwYwZw](1)\begin{bmatrix} X_{c}\\ Y_{c}\\ Z_{c}\\ \end{bmatrix} = [R\ t]\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w}\\ \end{bmatrix} (1)⎣⎡​Xc​Yc​Zc​​⎦⎤​=[R t]⎣⎡​Xw​Yw​Zw​​⎦⎤​(1)

PnP求解方法

  • DLT直接线性变换
  • P3P三对点估计位姿
  • EPnP(Efficient Pnp)
  • BA(Bundle Adjustment)光速法平差

DLT直接线性变换法

假设:相机经过标定,也就是相机的内参K已知。
已知:空间中的3D点坐标:[XwYwZw]T\begin{bmatrix} X_{w} & Y_{w} &Z_{w} \\ \end{bmatrix}^{T}[Xw​​Yw​​Zw​​]T 齐次坐标表示为[XwYwZw1]T\begin{bmatrix} X_{w} & Y_{w} &Z_{w} & 1 \\ \end{bmatrix}^{T}[Xw​​Yw​​Zw​​1​]T
投影点的坐标:$\begin{bmatrix}
u & v \
\end{bmatrix}^{T} $ 齐次坐标的表示为:[uv1]T\begin{bmatrix} u & v & 1\\ \end{bmatrix}^{T}[u​v​1​]T
详解的内参矩阵:KKK
求解:相机外参R、tR、tR、t
以下在Ipad上进行手写推倒

注意实际的R和t还应该乘以K−1K^{-1}K−1
字有点丑,大家见谅吧!!!
这里我有个问题:\color{red}{这里我有个问题:}这里我有个问题:我推倒的时候只推出了R=UVTR=UV^{T}R=UVT,没有推出正负解,很多博客这里给的是正负解,R=±UVTR=\pm UV^{T}R=±UVT,这里面怎么出现的负解呢?

EPnP

原论文:EPnP: An Accurate O(n) Solution to the PnP Problem

EPnP的特点

  • EPnP的复杂度是O(n)O(n)O(n),其他算法的复杂度基本上是O(n3)O(n^{3})O(n3),所以对于特征点较多的PnP问题,非常高效。
  • 核心思想是将3D点表示为4个控制点的组合,优化也只针对4个控制点,所以速度很快,在求解 Mx=0Mx=0Mx=0时,最多考虑了4个奇异向量,因此精度也很高。

步骤

1.在世界坐标系下确定4个控制点cjw,j=1,2,3,4c^{w}_{j},j=1,2,3,4cjw​,j=1,2,3,4,理论上可以任意取这四个控制点,只要不共面就行(因为共面无法组成坐标系),但原论文给了一种方法,取所有点的质心为c1wc^{w}_{1}c1w​并作为原点,通过主成分分析PCA得到另外的三个点c2wc^{w}_{2}c2w​、c3wc^{w}_{3}c3w​、c4wc^{w}_{4}c4w​建立坐标系。
2.已知参考点(特征点)在世界坐标系的坐标,Piw,j=1,...,nP^{w}_{i},j=1,...,nPiw​,j=1,...,n,以及控制点在世界坐标系下的坐标,计算权重因子$\alpha $
3.计算四个控制点在相机坐标系下的坐标cjc,j=1,2,3,4c^{c}_{j},j=1,2,3,4cjc​,j=1,2,3,4(核心)
4.计算参考点在相机坐标系下的坐标Pic,j=1,...,nP^{c}_{i},j=1,...,nPic​,j=1,...,n
5.根据ICP方法,计算R,t。

理论推倒

1.控制点及齐次重心坐标系

这里实际上是步骤2,为了表述清晰我先说明。
这里为什么叫Homogeneous Barycentric Coordinates(HB)呢?是因为使用步骤1的方法进行了控制点的选取,那么EPnP算法可以将参考点的坐标表示为控制点坐标的加权和:
Piw=∑j=14αijcjw,∑j=14αij=1(1)P^{w}_{i}=\sum_{j=1}^{4}\alpha_{ij}c^{w}_{j},\sum_{j=1}^{4}\alpha_{ij}=1 \ \ \ (1)Piw​=j=1∑4​αij​cjw​,j=1∑4​αij​=1   (1)
其中,αij\alpha_{ij}αij​是HB坐标,一旦控制点确定后,αij\alpha_{ij}αij​是唯一确定的。
在摄像头坐标系中存在同样的加权关系
Pic=∑j=14αijcjc(2)P^{c}_{i}=\sum_{j=1}^{4}\alpha_{ij}c^{c}_{j}\ \ \ (2)Pic​=j=1∑4​αij​cjc​   (2)
那么为什么在摄像头坐标系中存在同样的加权关系,这里对(2)进行手写推导:

这里考虑一下为什么要四个控制点,要知道PiwP^{w}_{i}Piw​是非齐次的3D坐标,Piw∈R3P^{w}_{i}\in R^{3}Piw​∈R3,假设3个控制点满足条件那么
Piw=[xiwyiwziw]=[c1wc2wc3w][αi1αi2αi3],∑j=14αij=1P^{w}_{i}=\begin{bmatrix} x^{w}_{i} \\ y^{w}_{i}\\ z^{w}_{i}\\ \end{bmatrix}=\begin{bmatrix} c^{w}_{1} &c^{w}_{2} & c^{w}_{3} \\ \end{bmatrix}\begin{bmatrix} \alpha_{i1}\\ \alpha_{i2}\\ \alpha_{i3}\\ \end{bmatrix},\sum_{j=1}^{4}\alpha_{ij}=1Piw​=⎣⎡​xiw​yiw​ziw​​⎦⎤​=[c1w​​c2w​​c3w​​]⎣⎡​αi1​αi2​αi3​​⎦⎤​,j=1∑4​αij​=1
一共是4个方程,而未知数是3个,这是一个超定方程组,只存在最小二乘意义上的解。换句话,在一般情形下,不存在精确满足4个方程的解。按照同样的思路,把4个控制点时的约束写成矩阵形式:
[Piw1]=C[αi1αi2αi3αi4]=[c1wc2wc3wc4w1111][αi1αi2αi3αi4](3)\begin{bmatrix} P^{w}_{i}\\ 1 \\ \end{bmatrix}=C\begin{bmatrix} \alpha_{i1}\\ \alpha_{i2}\\ \alpha_{i3}\\ \alpha_{i4}\\ \end{bmatrix}=\begin{bmatrix} c^{w}_{1} &c^{w}_{2} & c^{w}_{3} & c^{w}_{4} \\ 1& 1 &1& 1 \\ \end{bmatrix}\begin{bmatrix} \alpha_{i1}\\ \alpha_{i2}\\ \alpha_{i3}\\ \alpha_{i4}\\ \end{bmatrix} \ \ \ (3)[Piw​1​]=C⎣⎢⎢⎡​αi1​αi2​αi3​αi4​​⎦⎥⎥⎤​=[c1w​1​c2w​1​c3w​1​c4w​1​]⎣⎢⎢⎡​αi1​αi2​αi3​αi4​​⎦⎥⎥⎤​   (3)

通过上面的推导可以发现,αij\alpha_{ij}αij​在世界坐标系和相机坐标系下相同,这就意味着,我们可以在世界坐标系下求出αij\alpha_{ij}αij​,然后应用在相机坐标系下。根据公式(3),我们也可以得到αij\alpha_{ij}αij​ 的计算方法:
[αi1αi2αi3αi4]4×1=[c1wc2wc3wc4w1111]4×4−1[Piw1]4×1=C−1[Piw1](4)\begin{bmatrix} \alpha_{i1}\\ \alpha_{i2}\\ \alpha_{i3}\\ \alpha_{i4}\\ \end{bmatrix}_{4\times 1}=\begin{bmatrix} c^{w}_{1} &c^{w}_{2} & c^{w}_{3} & c^{w}_{4} \\ 1& 1 &1& 1 \\ \end{bmatrix}^{-1}_{4\times 4}\begin{bmatrix} P^{w}_{i} \\ 1\\ \end{bmatrix}_{4\times 1}=C^{-1}\begin{bmatrix} P^{w}_{i} \\ 1\\ \end{bmatrix} \ \ \ (4)⎣⎢⎢⎡​αi1​αi2​αi3​αi4​​⎦⎥⎥⎤​4×1​=[c1w​1​c2w​1​c3w​1​c4w​1​]4×4−1​[Piw​1​]4×1​=C−1[Piw​1​]   (4)

2.控制点的选择

这里实际上是步骤1
原则上,只要控制点满足C可逆且不共面就可以,3D参考点集为{Piw,i=1,2,...,n}\left\{ P_{i}^{w},i=1,2,...,n \right\}{Piw​,i=1,2,...,n},选择3D参考点的重心为第一个控制点:
c1w=1n∑i=1nPiwc_{1}^{w}=\frac{1}{n}\sum_{i=1}^{n}P_{i}^{w} c1w​=n1​i=1∑n​Piw​
对参考点进行重心化,得到矩阵A:
A=[P1wT−c1wT...PnwT−cnwT]A=\begin{bmatrix} P_{1}^{w^{T}}-c_{1}^{w^{T}} \\ ...\\ P_{n}^{w^{T}}-c_{n}^{w^{T}}\\ \end{bmatrix}A=⎣⎡​P1wT​−c1wT​...PnwT​−cnwT​​⎦⎤​

计算ATAA^{T}AATA的三个特征值λ1,λ2,λ3\lambda_{1},\lambda_{2},\lambda_{3}λ1​,λ2​,λ3​对应的特征向量v1,v2,v3v_{1},v_{2},v_{3}v1​,v2​,v3​,
那么剩余的三个控制点可以按照下面的公式来确定:
{c2w=c1w+λ1v1c3w=c1w+λ2v2c4w=c1w+λ3v3\left\{\begin{matrix} c_{2}^{w}=c_{1}^{w} + \sqrt{\lambda_{1}}v_{1} \\ c_{3}^{w}=c_{1}^{w} + \sqrt{\lambda_{2}}v_{2}\\ c_{4}^{w}=c_{1}^{w} + \sqrt{\lambda_{3}}v_{3}\\ \end{matrix}\right.⎩⎨⎧​c2w​=c1w​+λ1​​v1​c3w​=c1w​+λ2​​v2​c4w​=c1w​+λ3​​v3​​

世界坐标系下控制点的计算:第一步找到点云的重心作为坐标系的原点,然后通过主成分分析(PCA)确定坐标轴的三个方向。

3.计算控制点在相机坐标系下的坐标

手推公式:

图中最后的矩阵,齐次重心坐标αij\alpha_{ij}αij​,相机内参数和2D投影的像素坐标都是已知量,未知量是4个控制点在相机坐标系下的坐标。共12个位置参数,一个像点可以列2个方程,n 个像点可以列出2n 个方程。
M2n×12X12×1(5)M_{2n\times12}X_{12 \times 1} \ \ \ (5)M2n×12​X12×1​   (5)

公式(5)中即为4个待求的3D控制点坐标,共有12个未知数维度是12×1。M的大小为2n×122n\times122n×12,类比于前面讲的DLT方法,可以直接进行SVD分解。

M=U∑VT,O(n3)M=U \sum V^{T},O(n^{3})M=U∑VT,O(n3)

这里计算一下直接对M进行SVD分解的复杂度O(SVD(M))=2n×2n×2n=8n3=O(n3)O(SVD(M))=2n \times 2n \times 2n=8n^{3}=O(n^{3})O(SVD(M))=2n×2n×2n=8n3=O(n3),这里解释一下由于矩阵的乘法先进行每一行与每一列相乘,假设是第一行与第一列,那么会有2nx2n个参数,一共有2n行,所以是2nx2nx2n。
EPnP采用了一种复杂度更低更为高效的方法,即对MTMM^{T}MMTM进行特征值分解

这里的复杂度为O(n),计算公式为2nx12x12。
由此可以解出
X=∑i=1Nβivi(6)X=\sum_{i=1}^{N}\beta_{i}v_{i} \ \ \ \ (6)X=i=1∑N​βi​vi​    (6)
(6)式中,viv_{i}vi​是M的N个零特征值对应的特征向量(这块是为什么不太懂?懂得可以评论!!!!)\color{red}{(这块是为什么不太懂?懂得可以评论!!!!)}(这块是为什么不太懂?懂得可以评论!!!!)。对于第i个控制点-:
cic=∑k=1Nβkvk[i](7)c_{i}^{c}=\sum_{k=1}^{N}\beta_{k}v_{k}^{[i]} \ \ \ (7)cic​=k=1∑N​βk​vk[i]​   (7)
可以写成展开形式

上式中,vk[i]v_{k}^{[i]}vk[i]​是特征向量vkv_{k}vk​的第i个子向量,一共四个控制点,所以是四个。
通过对MTMM^{T}MMTM进行特征值分解我们能够求出N个VkV_{k}Vk​ 。但还需要求出 {βk},k=1,2,3,...,N\left\{\beta_{k} \right\}, k=1,2,3,...,N{βk​},k=1,2,3,...,N。才能最终求出在相机坐标系下的控制点坐标。
在原始论文中指出,MTMM^{T}MMTM特征值的个数与点对的数量以及焦距有关,EPnP算法建议只考虑N=1, 2, 3, 4的情况。

控制点在相机坐标系和世界坐标系的相对位置关系是不会发生改变的,引入相对位置约束条件:
∥cic−cjc∥=∥ciw−cjw∥(8)\left\| c_{i}^{c}-c_{j}^{c}\right\|=\left\|c_{i}^{w}-c_{j}^{w} \right\| \ \ (8)∥∥​cic​−cjc​∥∥​=∥∥​ciw​−cjw​∥∥​  (8)

该公式的含义是在4个控制点中任取两个点,一个为i,一个为j,进行相对位置关系计算。
将式(7)代入式(8)中:
∥∑k=1Nβkvk[i]−∑k=1Nβkvk[j]∥=∥ciw−cjw∥(9)\left\| \sum_{k=1}^{N}\beta_{k}v_{k}^{[i]}-\sum_{k=1}^{N}\beta_{k}v_{k}^{[j]} \right\|=\left\|c_{i}^{w}-c_{j}^{w} \right\| \ \ \ (9)∥∥∥∥∥​k=1∑N​βk​vk[i]​−k=1∑N​βk​vk[j]​∥∥∥∥∥​=∥∥​ciw​−cjw​∥∥​   (9)
对于4个控制点,根据排列组合可以得到C42C_{4}^{2}C42​个这样的方程,分别是1-2,1-3,1-4,2-3, 2-4,3-4。

对N=1,N=2,N=3,N=4的情况进行手写推导:

在N=4的情况下,有10个未知数,6个方程。在Opencv中实现EPnP算法很简单:

solvePnP(pts_3d, pts_2d, K, Mat(), r, t, CV_EPNP); // 调用OpenCV 的 PnP 求解,可选择EPNP,DLS等方法,默认采用迭代法(最小化重投影)

在OpenCV中开源代码并没按照上述4种情况的方法去求解,而是采用了近似的解法,具体的可以去看一下源码。
值得说明的是,在代码中LLL和β\betaβ 的排序有点不同,但不影响求解只要 LLL和β\betaβ 的顺序对应即可,以β\betaβ 为例说明。

Opencv的解法:
因为β11\beta_{11}β11​、β12\beta_{12}β12​、β13\beta_{13}β13​、β14\beta_{14}β14​、β22\beta_{22}β22​、β23\beta_{23}β23​、β24\beta_{24}β24​、β33\beta_{33}β33​、β34\beta_{34}β34​、β44\beta_{44}β44​这10个未知数是相关的,所以我们只需求出β11\beta_{11}β11​、β12\beta_{12}β12​、β13\beta_{13}β13​、β14\beta_{14}β14​,就能从中解出β1\beta_{1}β1​、β2\beta_{2}β2​、β3\beta_{3}β3​、β4\beta_{4}β4​的值。

在OpenCV的源码中取 的0,1,3,6列组成了新的矩阵,,然后进行SVD分解。由于,我们写出的公式跟代码列出的公式顺序不一样。因此我们对应的选择 的0,1,2,3列组成了新的矩阵L6×4L_{6\times 4}L6×4​。

上述方程可以列出6个,所以表示如下:
[S1TS12S1TS22S1TS32S1TS4][β11β12β13β14]=c(10)\begin{bmatrix} S_{1}^{T}S1& 2S_{1}^{T}S2 & 2S_{1}^{T}S3 & 2S_{1}^{T}S4 \\ \end{bmatrix}\begin{bmatrix} \beta_{11} \\ \beta_{12} \\ \beta_{13} \\ \beta_{14} \end{bmatrix}=c \ \ (10)[S1T​S1​2S1T​S2​2S1T​S3​2S1T​S4​]⎣⎢⎢⎡​β11​β12​β13​β14​​⎦⎥⎥⎤​=c  (10)
上述方程可以列出6个,因为i与j的不同组合有6种,所以表示如下:
L6×4β4×1=ρ6×1(11)L_{6 \times 4}\beta_{4 \times 1}=\rho_{6 \times 1} \ \ (11)L6×4​β4×1​=ρ6×1​  (11)
这有变成了与N=2一样的问题,只不过N=2的未知数是三个,这里面是4个,同理可以用SVD方法求解,得到β11\beta_{11}β11​、β12\beta_{12}β12​、β13\beta_{13}β13​、β14\beta_{14}β14​,就可以求出β1\beta_{1}β1​、β2\beta_{2}β2​、β3\beta_{3}β3​、β4\beta_{4}β4​

  • Gauss-Newton(高斯-牛顿法)优化参数β\betaβ
    如果大家需要经常研究优化问题,那么我强烈建议不要仅仅去看高翔老师的视觉SLAM14讲,特别是搞研究的,一定要去看最优化理论,推荐陈宝林老师的书,我在后续的博客可能也会从数学的角度写一些基础的算法。

进入正题:
优化目标: 缩小两个坐标系下控制点间距差。
优化的目标函数:
Error(β)ij=∥cic−cjc∥2−∥ciw−cjw∥2(12)Error(\beta)_{ij}=\left\|c_{i}^{c}-c_{j}^{c} \right\|^{2}-\left\|c_{i}^{w}-c_{j}^{w} \right\|^{2} \ \ (12)Error(β)ij​=∥∥​cic​−cjc​∥∥​2−∥∥​ciw​−cjw​∥∥​2  (12)

β∗=argminβ∑(i,j)s.t.i<j∥Errorij(β)∥2(13)\beta^{*}=arg min_{\beta}\sum_{(i,j)s.t.i<j}^{}\left\|Error_{ij}(\beta) \right\|^{2} \ (13)β∗=argminβ​(i,j)s.t.i<j∑​∥Errorij​(β)∥2 (13)

这是一个无约束的非线性最优化问题,Gauss-Newton求解式,首先求解Error(β)Error(\beta)Error(β)相对于β\betaβ的雅克比矩阵。

JijJ_{ij}Jij​的维度为1×4,将6个小雅克比矩阵JijJ_{ij}Jij​合成为6×4的大雅克比矩阵
J=[J12J13J14J23J24J34]J=\begin{bmatrix} J_{12}\\ J_{13}\\ J_{14}\\ J_{23}\\ J_{24}\\ J_{34} \end{bmatrix}J=⎣⎢⎢⎢⎢⎢⎢⎡​J12​J13​J14​J23​J24​J34​​⎦⎥⎥⎥⎥⎥⎥⎤​,记残差为e=Error=[Error12(β)Error13(β)Error14(β)Error23(β)Error24(β)Error34(β)]e=Error=\begin{bmatrix} Error_{12}(\beta)\\ Error_{13}(\beta)\\ Error_{14}(\beta)\\ Error_{23}(\beta)\\ Error_{24}(\beta)\\ Error_{34}(\beta) \end{bmatrix}e=Error=⎣⎢⎢⎢⎢⎢⎢⎡​Error12​(β)Error13​(β)Error14​(β)Error23​(β)Error24​(β)Error34​(β)​⎦⎥⎥⎥⎥⎥⎥⎤​
增量方程:
JTJδβ=−JTeJ^{T}J\delta \beta=-J^{T}eJTJδβ=−JTe
δβ\delta\betaδβ的求解在OpenCV中没有采用δβ=−(JTJ)−1JTe\delta\beta=-(J^{T}J)^{-1}J^{T}eδβ=−(JTJ)−1JTe的方式求解,而是对Jδβ=−eJ\delta\beta=-eJδβ=−e进行QR分解,从而得到δβ\delta\betaδβ。
因为J是一个超定矩阵,求线性最小二乘问题时,正规方程的解是不稳定的,所以用QR分解。
之后更新β\betaβ,β:=β+δβ\beta:=\beta+\delta\betaβ:=β+δβ

至此我们通过N=1,N=2,N=3,N=4可以确定四组β\betaβ和vvv,最后通过公式(6)计算控制点在相机坐标下的坐标。(具体选择哪种情况需要根据恢复影像的外方位元素后,计算的反投影误差决定!,不太理解,欢迎讨论)\color{red}{(具体选择哪种情况需要根据恢复影像的外方位元素后,计算的反投影误差决定!,不太理解,欢迎讨论)}(具体选择哪种情况需要根据恢复影像的外方位元素后,计算的反投影误差决定!,不太理解,欢迎讨论)

4.求解R,t(ICP方法)

转变成了已知一组3D点在不同坐标系下的坐标求位姿R,t的问题,也就是典型的ICP问题。
ICP(迭代最近点)算法推导详解这篇文章进行了详细推导与解释。

参考文章

https://zhuanlan.zhihu.com/p/361791835
https://blog.csdn.net/jessecw79/article/details/82945918#control_points_64
[泡泡机器人公开课]第三十九课:PnP 算法简介&代码解析-柴政

PnP算法详解(超详细公式推导)相关推荐

  1. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  4. log4j 配置详解(超详细)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  5. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  6. @Autowired注解详解——超详细易懂

    @Autowired详解 要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么? 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spr ...

  7. 斜率优化详解(超详细, 有图有代码有注释)

    文章目录 斜率优化引入 从例题开始 斜率优化Part 1: 推为斜率式 斜率优化Part 2: 合法点集的斜率单调性 Part 3: 找到最优决策点 Part 4: 斜率优化大流程 Part 5: 斜 ...

  8. web服务器常见配置搭建详解(超详细)

    前言: 本博客借鉴一些写的比较好的博客,进行归纳总结,整理了一篇比较详细的服务器常见配置搭建教程 一来是和大家一起分享,二来也是作为自己的学习笔记记录一下. 温馨提示: 篇幅较长,请分阶段选择性查看. ...

  9. 计算机网络 - IPv4 常考知识点详解(超详细!)

    目录 一.IPv4分组 1.IPv4分组的格式 2.IP数据报分片 3.网络层转发分组的流程 二.IPv4地址与NAT 1.IPv4地址 2.NAT 三.子网划分与子网掩码.CIDR 1.子网划分 2 ...

最新文章

  1. are exo exo是什么歌 we_are exo exo是什么歌 we_EXO we are one
  2. [SDOI2015]星际战争
  3. 关于Verilog的可综合性
  4. Eclipse代码自动补全的颜色修改
  5. P2371-[国家集训队]墨墨的等式【同余最短路】
  6. Java虚拟机是如何执行线程同步的
  7. python元胞自动机模拟交通_结构专栏 | 解析DEFORM软件中的元胞自动机法
  8. 字节大数据手册火了 ! 离线数据/实时数据/数据仓库ETL/实时交易系统/啥都有 !...
  9. 马斯克:我上大学时就想创立电动汽车公司
  10. RequestBody Ajax写法
  11. 机电传动控制第二周作业
  12. PB设置表格背景颜色
  13. java Io,读写文件拒绝访问
  14. layui表格时间显示格式
  15. 4.人工智能时代下的大数据
  16. 运营必备九大互联网思维
  17. 普通人存多少钱才能不焦虑?
  18. 前端程序员的日常与心酸
  19. 【ESD专题】2.ESD防护及保护器件(电介质和压敏电阻)
  20. 仿淘宝左侧菜单导航栏纯Html + css 写的

热门文章

  1. E书家 一个chm,pdf电子书分享平台
  2. PAT 1004 成绩排名 (20分) 犯了所有可能犯的错误
  3. it试用评估_it行业试用期工作总结
  4. 抖音开发对接之订单取消消息
  5. 通过Dockerfile安装实例
  6. 七夕王者服务器维护,王者荣耀:神秘商店重新开启,两大良心补偿确定,七夕福利全一览爱了...
  7. Flink 实时计算在微博的应用
  8. python怎么变各种颜色_python – 在matplotlib中变暗或变亮颜色
  9. 致力协同办公oa系统服务器设置,致力协同办公OA系统——安装手册.pdf
  10. 深蓝学院-视觉SLAM课程-第2讲笔记--三维空间刚体运动