相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
相机雷达外参标定综述--Automatic targetless LiDAR–camera calibration: a survey
- 前言
- 1 Introduction
- 2 Background
- 3 Automatic targetless LiDAR–camera calibration
- 3.1 Information theory based method(信息论方法)
- 3.1.1 Pairs of point cloud and image attributes(属性对)
- 3.1.2 Statistical similarity measure
- 3.1.3 Optimization methods
- 3.1.4 Summary of information theory based methods
- 3.2 Feature based methods(特征法)
- 3.2.1 Feature extraction
- 3.2.2 Feature matching strategies
- 3.2.3 Summary of feature based methods
- 3.3 Ego‑motion based methods(运动估计法)
- 3.3.1 Hand‑eye based methods(手眼标定法)
- 3.3.2 3D structure estimation based methods(3D结构重建的方法)
- 3.3.3 Other Methods
- 3.3.4 Summary of ego‑motion based methods
- 3.4 Learning based methods(深度学习方法)
- 3.4.1 End-to-end methods(端到端方法)
- 3.4.2 Hybrid‑learning methods(混合学习方法)
- 3.4.3 Summary of learning based methods
- 总结
前言
毕设的工作和相机雷达外参标定其实有些关联,加上在秋招面试的时候其实也被问到了很多次相机-雷达外参标定的内容,所以这里找了一篇时间比较近的综述文章,来对相机雷达标定的各种方法来进行一个了解。
本文没有对文章进行完全的翻译,而是对一些内容进行了自己的理解和翻译,如有错误烦请指出
文章链接:Automatic targetless LiDAR–camera calibration: a survey
1 Introduction
文章把无目标相机类大外参标定分成了四类:
(1) 基于信息论的方法,测量相机和雷达两种模态之间的共同属性的联合直方图之间的统计相似性(原文:information theory based methods that measure the statistical similarity between joint histogram values of several common properties between the two modalities,没完全理解,后面结合具体再看)
(2) 特征法:基于外部环境中的几何、语义或者运动特征来进行
(3) ego-motion方法,其实就是基于传感器自身的运动来进行的
(4) 基于神经网络的深度学习方法
2 Background
首先第一点是,这里提到的外参标定单指空间上的外参标定,实际上时间同步也可以算一种外参标定,但是在这篇文章里首先默认时间同步被实现处理好了;和时间同步类似的,相机内参也被认为事先标定好了
之后先是关于相机-雷达之间的外参的介绍,这里是比较基础的内容了,所以就只放一张文章中的图片了
然后是比较重要的一部分,介绍了相机雷达外参标定的分类准则。这里的分类针对的还不是automatic targetless methods,还是针对整个相机雷达的标定方法,所以这里的分类准则主要就是基于是否需要标定板以及是否需要人为介入
- Manual target-based
这种方法就是需要人为来构建图像和点云之间标定板之间的联系(指的也就是人工选出来),比较常用的标定板包括:棋盘格,ArUco码,定制的一些平面标靶以及普通的盒子等等。通过人为介入,我的理解就是可以构建出这些标定板在点云和图像之间的同名点,也就构建出了约束,然后基于最小二乘优化就可以求解了
- Automatic target-based
和上一种方法相比,这里的区别就在于无需人为干预,私以为,这里更关键的部分应该在标靶的自动提取上,但文章这里没有做什么介绍,只是介绍了一些工作:
“Automatic camera and range sensor calibration using a single shot.” – 看起来是有多个标定板,所以可以实现一次拍摄的标定
“Automatic LiDAR-camera calibration of extrinsic parameters using a spherical target.” – 这个用到了球形靶标,通过点云和图像检测球面,然后拟合球心,根据球心构建约束
- Manual targetless
外参在类似于自动驾驶的场景中可能需要在线微调,这里的manual指的是手动指定点云和图像之间的关系,其实我觉得这个也算一种“标靶”,只不过这个标靶不再是实物的形式,而变成了人为定义的“规则”。
- Automatic targetless
文章的重点,这种方法依旧要依赖于外部的环境,但这里没有明确的标靶也没有人为指定的规则。因为这是文章的主题,所以在这一小节只是简单引入,也介绍了常见的几种具体的分类方法:离线VS在线,人为标定VS自动标定等等。
3 Automatic targetless LiDAR–camera calibration
首先回顾一下前文提到的四种分类:其中信息论法、特征法和运动估计法其实都是从环境中提取信息的,深度学习法则是从隐式的信息中获取标定的方法的。基于这四种方法分类,一是出于如何利用周围环境的信息进行校准考虑。二是,这四个类别还为不同的应用场景提出了校准方法。
信息论方法 – 环境中特征比较少,让3D点云投影和整张图像的相似性(similarity)最大
特征法 – 环境中能提供较多的语义或者几何约束
运动估计法 – 传感器都在运动
深度学习法 – 需要较多的计算资源
3.1 Information theory based method(信息论方法)
基于信息论的方法通过最大化 LiDAR 传感器和相机之间的相似变换来估计外部参数,该相似变换通过各种信息度量来衡量。基本原理可以表示为:
T ∗ = argmax T IM ( p r o j T ( P L ) , p C ) T^* = \underset{T}{\operatorname{argmax}} \text{ IM}(proj_T(\mathbf{P}_L), p_C) T∗=Targmax IM(projT(PL),pC)
这里需要注意的是, I M IM IM在这里指的是投影后的点云和图像之间能反映相似性的指标(有点蹩脚)。那么这种方法可以大致分为三个步骤:
- 雷达点云投影至图像平面
- 统计相似性(IM指标),所以这里的核心就是这个指标的选取了?
- 全局优化
这里也是先简单介绍了下所谓的“属性相似性分布”:比如反射率高的雷达点云对应着图像中的明亮表面,还有可以提取梯度幅度和方向等等。
3.1.1 Pairs of point cloud and image attributes(属性对)
以下都以“点云属性 - 图像属性”
- 反射率 – 灰度值
当摄像机和激光雷达同时观察环境时,激光雷达点云的反射率和图像的灰度强度之间会存在统计相似性,因为这两个属性主要取决于物体的相同表面属性。类似的还可以把图像属性换成:Hue(色调),可见光波长,颜色等等,这些特性都是基于物体表面的属性的。 - 表面法线 – 灰度值
在给定光源的情况下,表面法线也是影响图像中相应像素灰度的重要指标,根据雷达点云估计表面发现的方法有很多,给定一个点的法向量之后,还可以计算出水平面之间的对应角度。(主要参考文献来自于:Zachary Taylor)因为我们平常都会默认光线是来自上方的,这个角度对灰度影响其实很大,也就意味着表面法线和灰度强度之间存在着统计关系。 - 梯度量级和方向 – 梯度量级和方向
这个属性对的依据来自于:如果图像上一个区域的像素与周边有比较明显的区别,那么对应到点云深度上应该也是一样的,反过来也是。这种相关性是存在的,因为这些强度的变化通常代表背景与检测到的材料或物体之间的差异。图像的梯度的话比较好办,用Sobel算子,点云的梯度的话则依旧是以Zachary Taylor的文献为例,将每个像素投影到球体上,然后根据 Taylor 等人提出的算法,使用其最近的 8 个邻居计算梯度。 - 3D语义 – 2D语义
理论上3D点的语义标签与其对应的图像标签应该是相同的,所以利用这种信息理论上是可以进行数据关联的;在分割任务中,可以使用神经网络模型分别预测图像和点云中的逐点语义标签。(直观感觉这种方法不太适合标定呢?后面再看看)
补充:后面又看了下,这里的语义后面被归到了语义质心,所以还是没有问题的。 - 多种3D-2D属性对的结合
一些方法发现,使用混合特征有利于提高算法在不同环境下的鲁棒性,而不是依赖一对特定的 3D-2D 属性来估计像素相似度 (Irie et al 2016)。它们使用一组组合的 3D-2D 属性对来计算相似度测量值,并为每个属性对分配适当的权重。这些属性集通常是上述一些属性对的组合,例如点云中的反射率、表面法线和梯度,以及图像中的灰度强度和梯度。它们使用一组组合的 3D-2D 属性对来计算相似度测量值,并为其分配适当的权重。
3.1.2 Statistical similarity measure
依据上面的属性对,就可以利用不同的特性来衡量点云和图像之间的统计相似性了(更高的统计值可以认为有更好的联系),文章接下来总结了一些常用的统计特性
- Mutual Information(MI)
这个指标也是临时去搜了下,还是根据wiki两个随机变量的互信息(mutual Information,MI)度量了两个变量之间相互依赖的程度。具体来说,对于两个随机变量,MI是一个随机变量由于已知另一个随机变量而减少的“信息量”(单位通常为比特)。互信息的概念与随机变量的熵紧密相关,熵是信息论中的基本概念,它量化的是随机变量中所包含的“信息量”。
OK,依旧没完全理解,先接着往下看,MI定义的计算公式为:
M I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) MI(X,Y) = H(X) + H(Y) - H(X,Y) MI(X,Y)=H(X)+H(Y)−H(X,Y)
这里分别是个体的熵和联合的熵,这个计算公式还是比较经典:
H ( X ) = − ∑ x ∈ X p X ( x ) log p X ( x ) H ( Y ) = − ∑ y ∈ Y p Y ( y ) log p Y ( y ) H ( X , Y ) = − ∑ x ∈ X ∑ y ∈ Y p X Y ( x , y ) log p X Y ( x , y ) \begin{aligned} H(X) &= -\sum_{x\in X} p_X(x)\log p_X(x) \\ H(Y) &= -\sum_{y\in Y} p_Y(y)\log p_Y(y) \\ H(X,Y) &= -\sum_{x\in X}\sum_{y\in Y} p_{XY}(x,y)\log p_{XY}(x,y) \end{aligned} H(X)H(Y)H(X,Y)=−x∈X∑pX(x)logpX(x)=−y∈Y∑pY(y)logpY(y)=−x∈X∑y∈Y∑pXY(x,y)logpXY(x,y)
当然这么敢说太抽象了,文章简单描述了下:在实际应用中,我们可以使用例如每个 LiDAR 点的反射率值和每个图像像素的强度作为两个随机变量 X 和 Y。然后可以使用诸如核密度估计 (KDE) 之类的方法来估计两个随机变量的概率分布。 总之就是选择一种统计指标,然后计算两个变量的MI指标就可以。
- NMI(Normalized MI)
MI可能会被点云和图像包含的总信息量影响,这种时候外参标定回受影响,NMI是把MI值进行的归一化,计算公式变成了:
N M I ( X , Y ) = H ( X ) + H ( Y ) H ( X , Y ) NMI(X,Y) = \frac{H(X) + H(Y)}{H(X,Y)} NMI(X,Y)=H(X,Y)H(X)+H(Y)
- Gradient Orientation Measure(GOM)
梯度方向测量,计算的是两幅图像之间的梯度方向的对齐程度。这里梯度的值也被看作权重值,与MI相比,因为GOM使用的是梯度,所以它会考虑相邻点的值和图像中存在的几何形状。
- Normalised Information Distance (NID)
归一化信息距离,2004年由Li Ming等人提出,在多传感器领域可用于不同传感器之间的匹配,是一种相似性度量。相比于MI,NID不会使用全部的图像信息,不会犹豫丰富纹理区域之间的匹配而影响到全局图像的配准上。
- Bagged Least-squares Mutual Information (BLSMI)
这个指标直接没怎么看懂。。这里先放一下翻译文字,BLSMI (由Irie等人在2016年提出) 是一种组合方法,它结合了基于核的依赖估计器和通过自助法聚合(bagging)实现的降噪技术。与普通的互信息(MI)相比,BLSMI的一个主要优势在于它对异常值具有更强的鲁棒性,这是因为其计算过程中不包含对数运算。看起来这个是和机器学习结合的一个指标?
- Mutual Information and Distance between Histogram of Oriented Gradients (MIDHOG)
这是一个结合指标,一部分是NMI,另一部分就是 Distance between Histogram of Oriented Gradients (DHOG,方向梯度直方图之间的距离),衡量的也是图像之间的关联性。
M I D H O G = ( 2.0 − N M I ) + α ⋅ D H O G MIDHOG = (2.0 - NMI) + \alpha \cdot DHOG MIDHOG=(2.0−NMI)+α⋅DHOG
当应用于纹理较少的图像时,DHOG 的表现比 NMI 好得多。然而,对于纹理较多的图像,NMI 的结果更准确。 因此,MIDHOG 能够通过继承 MI 和 DHOG 的属性来处理不同的场景。
- Mutual Information Neural Estimation (MINE)
也是看不太懂的一个指标,使用神经网络来估计高维随机变量之间的MI。MINE 可扩展、灵活,并且完全可以通过反向传播进行训练,可用于互信息估计、最大化和最小化。MINE 使用 Donsker-Varadhan (DV) 对偶将 MI 表示为
I ( X , Y ) = sup θ ∈ Θ E P ( X , Y ) [ F θ ] − log ( E P ( X ) P ( Y ) [ e F θ ] ) I(X,Y) = \sup_{\theta\in\Theta} \mathbb{E}_{P(X,Y)}[F_\theta] - \log(\mathbb{E}_{P(X)P(Y)}[e^{F_\theta}]) I(X,Y)=θ∈ΘsupEP(X,Y)[Fθ]−log(EP(X)P(Y)[eFθ])
其中 F / t h e t a F_/theta F/theta是神经网络参数化的函数 / t h e t a /theta /theta就是神经网络的参数。
3.1.3 Optimization methods
这部分就是总结了一些现有的优化方法,不乏一些耳熟能详的名字:
- Barzilai–Borwein steepest descent method:Barzilai-Borwein 最速下降法是一种梯度法,其步长在成本函数梯度的方向上自适应。
- Nelder–Mead downhill simplex method:Nelder-Mead 方法是一种直接搜索方法,常用于求解导数未知的非线性优化问题。
- Levenberg–Marquardt algorithm:Levenberg-Marquardt算法是一种常用的解决非线性最小化问题的迭代算法。
- Particle swarm optimization:粒子群优化是一种全局优化算法。它的工作原理是将初始粒子群随机放置在搜索空间中,然后迭代优化以解决问题。
- Broyden–Fletcher–Goldfarb–Shanno (BFGS) quasi-Newton method:BFGS 拟牛顿法是一种基于梯度的算法,用于最大化目标函数。
- The Bound Optimization BY Quadratic Approximation (BOBYQA) algorithm:BOBYQA 算法 (Powell 2009) 是一种确定性的、无导数的优化算法,依赖于迭代构造的二次近似。
3.1.4 Summary of information theory based methods
这部分总结直接看表吧(这里就截图了):
我看下来觉得这部分的核心其实就在于:构建出来图像和点云投影后的图像之间的全局关联,所以这里选择的一些特性其实我觉得也算是一种变样的特征,然后进行数据关联后再进行外参估计的这样一个过程,给我的直观感觉比较复杂。
3.2 Feature based methods(特征法)
特征法顾名思义,这里直接进行特征的提取和匹配,不再进行统计量的计算过程。常用的特征可以被归结为三类:几何特征、语义特征和运动特征,这些特征需要从雷达点云和图像上进行提取。具体来说,几何特征由环境中的一组几何元素(如点或边)构成。语义特征是高级表示,通常指定环境中的语义感知组件,例如天际线(skyline)、汽车和电线杆。运动特征描述移动物体的特征,包括姿势、速度、加速度等。特征法也可以大致分为三个步骤:特征提取、特征匹配和变换估计
- 特征提取:从点云和图像中提取稳定且独特的特征,这些特征通常表示周围环境中的特定几何或语义元素。
- 特征匹配:特征匹配旨在提供从点云中提取的特征与图像之间的对应关系。为此,应用了各种特征描述符以及特征之间的空间关系。
- 变换估计:此步骤根据特征匹配提供的特征对应关系估计 LiDAR 相机校准的转换关系,即外参。常用的算法包括矩阵奇异值分解(SVD)等。
特征法外参估计的一个大致流程图如下:
3.2.1 Feature extraction
特征提取的方法有很多了,但在相机雷达标定这种场景下,要使用的是一对用于点云和图像的特征提取方法。和信息论方法相似,也是按照"点云方法 – 图像方法"进行的总结,然后将这些特征对分成了三类:分别使用几何特征、语义特征和运动特征。
首先是几何特征,通常使用特征点或者边缘特征,一是特征点(其实是points of interest,我感觉就翻译成特征点就可以了),这里值得注意的一点是,说是提取点云的特征,但看起来大部分办法也是把点云投影到图像后再对投影图像做的特征提取
- Förstner operator–Förstner operator:Förstner 算子 是一种快速算子,用于检测和精确定位不同的点和角点。该算法以亚像素精度从图像中提取连接点和圆形点。可以通过将点投影到距离图像中并应用 Förstner 算子来提取 LiDAR 点云中的兴趣点。
- Corner–Corner:在城市场景的数据中可以自然地找到角点。这些边缘可以通过边缘检测器(如 Sobel 算子)检测出来。与上述 Förstner 算子的情况类似,角点特征提取可以在相机图像和点云投影强度图像上执行。
- SIFT–SIFT:尺度不变特征变换 (SIFT)是一种流行的特征点,用于检测和匹配图像中的局部特征。使用 SIFT,提取的点特征对于图像平移、缩放和旋转具有不变性,并且对于光照变化和仿射或 3D 投影具有部分不变性。有几种 SIFT 变体可用于点特征提取。例如,加速稳健特征 (SURF) 是 SIFT 的更快版本,仿射 SIFT (ASIFT)将 SIFT 方法扩展为完全仿射不变。对于图像和点云,基于 SIFT 或其变体的兴趣点提取是在原始图像和投影图像上执行的。
除了特征点,边缘特征也是很常用的一种,点云和图像中的这些边缘包含有用的环境几何信息,特别是对于点特征提取并不稳定性的环境。
- Depth discontinuity—Intensity difference:利用深度不连续性可以提取 LiDAR 点云中的边缘。具体而言,通过计算相邻点之间的深度差异并滤除差异值低于预设阈值的点来从点中识别出这些边缘(Levinson and Thrun 2013)。 该思想已广泛应用于各种边缘提取方法(Blaga and Nedevschi 2017;Banerjee et al. 2018;Munoz-Banon et al. 2020;Ma et al. 2021;Wang et al 2018;Xu et al 2019)。该思想可以进一步扩展,首先通过对点云进行上采样生成密集深度图,然后通过计算深度的梯度变化来识别边缘(Castorena et al 2016)。同时,可以通过检测像素强度的形状变化来提取图像中的边缘。通常假设点云中通过深度不连续性提取的边缘与图像中通过强度差异提取的边缘一一对应。
- Depth discontinuity—Sobel operator:LiDAR点云边缘提取和上面介绍的一样,但头像的边缘特征则换成了Sobel算子(根据灰度值进行图像边缘提取的方法),Sobel 算子结合高斯平滑和微分来计算图像强度函数梯度的近似值。当然,这些年图像的边缘提取方法还包括CANNY以及LSD算法等。(PS:这里所谓的图像边缘提取感觉就是图像线特征提取?)
- 3D直线检测-LSD:我感觉这里的3D直线检测和边缘提取差别不是很大。。3D 线检测器基于点云分割和 2D 线检测器,针对结构化环境采用简单的 3D 点云段检测算法。图像的话则是用LSD。
- Depth continuity—Canny detector:前面说的是深度不连续性,这里则是深度连续性。其实两种对应的是不同的边缘,深度不连续对应的往往是前景和背景分割的那种边缘,而深度连续边缘是具有连续变化的深度值的边缘,通常是平面交叉线。通常的提取方法是通过点云体素划分和平面拟合来提取,即将点云划分为给定大小的小体素,然后反复使用 RANSAC 拟合和提取这些体素中的平面 (Yuan et al. 2021)。图像的话则是Canny算子。
- Depth continuity—L-CNN:这里主要是对文章"LiDAR-Camera Calibration Using Line Correspondences"的解释,建筑物的边缘通常具有尖锐的边缘和明确的线条纹理,这些都可以在点云和图像中轻松提取。通过各种点云分割方法识别相应建筑物的平面。然后,基于这些分割的三维平面,通过线检测算法方便地获得点云中的边缘,即平面相交线。图像方面,可以训练L-CNN的端到端神经模型,以输出包含语义上重要且几何上突出的线和交叉点的矢量化线框。
但是值得注意的是,现实环境往往包含大量相似的几何特征,这会增加激光雷达-相机标定的难度。而语义特征往往可以反应一些高级的特性,包括天际线(skyline)、车辆以及道路线等等。这些信息在不同的传感器下也应该是一直的,所以可以基于这些语义信息约束来进行外参的标定。
- Skyline–Skyline:天际线是城市环境中天空与其他物体之间的曲线或轮廓。此语义特征在 LiDAR 点云和图像中都很明显,可以提取出来进行校准。天际线的提取也有很多方法,文章做了简单的介绍,这里不再赘述。
- Lane and Pole–Lane and Pole:车道线和电线杆都是有明显线形的物体,除了检测像素变化一类的提取方法,像BiSeNet-V2这种神经网络也是被广泛使用,并通过CRF算子改进轮廓来进一步完善。
- 3D Semantic Centroid–2D Semantic Centroid:因为CNN在语义分割方面的突出表现,有很多网络也被用于相机雷达标定中的语义分割了。像"Soic: semantic online initialization and calibration for lidar and camera."文章中,就分别用了PointR-CNN进行点云语义分割和Nvidia Semantic Segmentation进行图像的语义分割。
除了几何特征和语义特征,文章还提到了一种运动特征:比如运动的轨迹。但我觉得这个其实和下面ego-motion的部分更贴合一些啊?先往下看看
3.2.2 Feature matching strategies
上面介绍的特征提取方法都是分别提取到了点云和图像的特征,那么两者之间的匹配就是必不可少的了。文章接下来就是对常见的特征匹配策略进行了总结。
- Descriptors similarity(描述子相似性):这个一般都是针对特征点的,对每个特征点都可以依据一定的原则进行描述子的计算,当然,这个也是针对点云投影后图像的,匹配方法也有很多了:暴力匹配,最近邻点等。(针对误匹配的主要方法是RANSAC)
- Spatial geometrical relation(空间几何关系):该类特征匹配策略旨在直接利用空间几何关系和最优化方法建立给定两个特征集的对应关系,尽可能地对齐分布在空间不同位置的特征(如线特征),并假设当这些特征完全对齐时,校准参数达到最优解。
- Semantic relation(语义关系):这个就没什么好说的了,就是语义信息一致匹配,比如车对车,道路线对道路线。
- Trajectory relation(轨迹关系):轨迹关联的基本方法是基于匹配具有相同时间戳的两个轨迹中的位置。此外,速度和曲率也可用于匹配这些轨迹。
3.2.3 Summary of feature based methods
也是直接看表吧(依旧是保存成图片了)
3.3 Ego‑motion based methods(运动估计法)
感觉这里才像是"运动特征法",包括原文也是"In this scope, some methods try to find the correspondence between the trajectories generated by LiDARs and those by cameras",进一步分成了两大类:手眼标定和3D结构估计。
3.3.1 Hand‑eye based methods(手眼标定法)
手眼标定其实在机器人视觉里是一个基本且经典的问题,这里不做详细的介绍。这个问题最后也可以转换成 A X = X B AX = XB AX=XB的形式,其中 A 和 B 分别描述手臂和相机的运动,X 是所需的未知变换矩阵。先简单介绍一些符号表达:
T T T:LiDAR和相机之间的变换矩阵
T L i T_L^i TLi:LiDAR从时间 t i t_i ti到 t i + 1 t_{i+1} ti+1的运动或变换
T C i T_C^i TCi:相机从时间 t i t_i ti到 t i + 1 t_{i+1} ti+1的运动或变换
然后就可以直接构造恒等关系:
T C i T = T T L i T_C^iT = TT_L^i TCiT=TTLi
关于手眼标定的可视化描述可见下图:
手眼标定也可以简单分成三个步骤:
- 每种传感器的运动估计:也就是分别估计LiDAR的运动和相机的运动。
- 估计外参:根据上面的公式来估计外参,通常会把变换矩阵拆开,先根据 R C i R T = R T R L i R_C^iR_T = R_TR_L^i RCiRT=RTRLi来估计旋转,然后直接把旋转带入来求解平移: ( R C i − I ) t T = R T t L i − t C i (R_C^i - I)t_T = R_Tt_L^i - t_C^i (RCi−I)tT=RTtLi−tCi
- 细化外参:根据齐次方程解出来的初值很可能包含误差,因此可以利用一些其他的约束来进一步优化外参,来减小误差。
经典的手眼标定流程如下:
文章对手眼标定的方法就不像前两种那种"雷达-图像"对应的方式进行了,而是主要针对每个步骤进行的。首先是运动估计方面:
- LiDAR motion estimation(雷达运动估计):这就是经典问题了,最经典的算法就是ICP了,当然还有变种ICP以及NDT之类的方法,其实这里我感觉就可以看作是LiDAR里程计问题(经典框架比如LOAM)。
- Camera motion estimation(相机运动估计):也是经典问题,第一种思路就是用SfM解决,另一种也是堪称里程计的方法来解决,比如ORB-SLAM。
然后文章对旋转的表达也进行了分类(经典),还是旋转矩阵、角轴、李代数以及四元数。(关于旋转的表达实在是太经典的问题了,事实上文章对这里的描述还不如很多博客的描述,所以这里也就不再细说了,可以自行查阅)
关于外参细化,其实还是利用环境信息进行了一些约束,比如对齐边缘等等,下面也是分别介绍了几类。
- Edge alignment(边缘对齐):这里感觉又回到前面特征法那里了。。比如可以提取线特征作为一种约束
- Intensity matching(强度匹配):这里感觉则是回到信息论法了。。如用强度信息
- Depth matching(深度匹配):LiDAR 深度图是通过初始外部参数投影 LiDAR 点云生成的,而相机深度图是通过单目深度估计生成的。其原理是 LiDAR 深度图中的任意点应与相机深度图中同一像素坐标处的像素绑定,并且它们的深度值应相同。
- Color matching(颜色匹配):这个其实有点像光流法的意思,假设点云中的点与两个连续帧中的相机图像具有相同的颜色。首先将点投影到图像上以获得局部像素的对应颜色,然后将相同的点投影到图像的下一帧,时间偏移由估计的运动信息补偿。通过最小化当前帧和前一帧中点的颜色之间的平均差异,可以获得更准确的外参。
- 3D-2D point matching(3D-2D匹配):看起来就是重投影误差,经典
关于手眼标定的总结如下表(图):
3.3.2 3D structure estimation based methods(3D结构重建的方法)
这里其实又是SfM,主要介绍了几个工作吧(我觉得这里的分类并不是很好,很多工作都是重叠的):
- “Refined non-rigid registration of a panoramic image sequence to a LiDAR point cloud.”
先用2D图像恢复3D点云,然后把恢复出来的和雷达点云ICP,最后通过SIFT特征点来增加约束。 - "Fully automatic registration of image sets on approximate geometry. "
这篇文章将标定分为粗配准和细配准过程,将ICP算法应用于LiDAR生成的点云得到中间结果后,再用MI来细化结果。 - “Automatic extrinsic calibration of monocular camera and LIDAR in natural scenes.”
这篇文章利用车辆运动中的序列场景信息获取初始外参,该方法利用SfM算法从二维图像序列中计算出三维点,并通过ICP算法将SfM点与LiDAR点配准得到初步结果,然后将三维LiDAR点投影到二维图像平面,利用边缘特征点采用组合优化方法进一步提升外参数的精度。 - “Automatic registration of panoramic image sequence and mobile laser scanning data using semantic features.”
SfM和LiDAR点云密度差距比较大的时候ICP很容易就失败了,这篇文章提出了一种基于从全景图像和点云中提取语义特征的自动配准方法。他们利用GPS和IMU辅助SfM算法获取旋转参数,然后从两个模态中提取车辆,通过最大化相应目标对的重叠面积来估计平移参数。 - “Online targetless end-to-end camera-LIDAR self-calibration.”
这篇文章提出了一种具有对象级配准的外部校准方法。首先,他们使用 SfM 从连续的相机图像生成可用于对齐和配准的点云,然后根据对象检测结果在生成的点云和 LiDAR 点云之间引入目标级对齐。 - “On-the-fly camera and lidar calibration.”
这个主要是对上面工作的扩展,主要针对配准阶段进行了优化。他们在对象级配准步骤之后使用点级 ICP 方法设法减少配准误差,然后引入了一种基于曲线的非刚性点云配准细化步骤,该步骤建立在非均匀有理基样条近似之上。
3.3.3 Other Methods
剩下的还有一些其他的方法,这部分就没再仔细看了(都是有一些特殊性的工作,感觉没有什么拓展性)
3.3.4 Summary of ego‑motion based methods
这部分其实没什么好说的,感觉类似于一种松耦合的方法,分别用相机和LiDAR的信息,然后再想办法把两部分匹配起来。
3.4 Learning based methods(深度学习方法)
3.4.1 End-to-end methods(端到端方法)
这里的端到端指的是:输入点云和图像,直接输出外参。
正常的思路是把点云、图像和真实参数直接输入到模型,但是因为数据量很大,所以这个真实参数注定会很麻烦,所以在文章"RegNet: multimodal sensor registration using deep neural networks."中,就引入了一个标定偏差 ϕ m i s − c a l i b \phi_{mis-calib} ϕmis−calib,利用带有误差的外参初值 T i n i t T_init Tinit和相机内参 K K K进行投影,这样就可以获得大量的训练数据了。
端到端的方法的网络结构可以分为三类:
-
(1)Regression(回归):此类别中的方法以 RGB 图片和深度图像作为输入。它们的网络通常有两个分支,分别从 RGB 和深度图像中提取特征。然后,通过特征匹配组件融合两种模态的特征。最后,对从两种模态中提取的全局信息进行回归,以获得误校准参数。回归方法的通用架构如下所示。
-
(2)RegNet:这是第一个将特征提取、特征匹配和全局回归集成到CNN里的相机雷达外参估计的模型,里面具体使用了NiN模块去提取LiDAR深度图和RGB图像的特征。
-
(2)CalibNet:考虑了几何信息并在模型中引入了 3D 空间变换层。RGB 分支是预训练的 ResNet-18的卷积层,深度分支是类似的网络,但过滤器数量减半。然后将两个输出连接起来并通过全局聚合块。CalibNet 通过最大化图像和点云之间的几何和光度一致性来执行端到端训练。
-
(2)RGGNet:该方法考虑了黎曼几何,并采用深度生成模型来构建容差感知损失函数。RGGNet 不仅考虑校准误差,还关注误差范围内的容差
-
(2)CalibRCNN:结合了CNN和LSTM,两个分支的输出特征被融合,然后输入到 LSTM 层以提取时间特征进行顺序学习。CalibRCNN 不仅在连续帧之间添加了姿势约束,还使用几何和光度损失来提高预测变换参数的校准精度。
-
(2)CalibDNN:这是一个具有一个模型和一次迭代的简单系统,它考虑了变换损失和几何损失,以最大限度地提高多模态数据的一致性。
-
(2)LCCNet:为了匹配深度图像和 RGB 图像之间的特征,构建了成本体积层,而不是直接连接特征。除了平滑的 L1-Loss 作为地面实况的监督外,还在损失函数中添加了点云约束。
-
(3)Calibration Flow:此类别中的方法以 2D 图片和 LiDAR 深度图作为输入。将来自两种模态的图像输入到光流网络中,以预测未校准的深度图与 RGB 图像之间的流动,然后获得云点与图像像素之间的对应关系。最后,可以通过最小化投影误差来优化初始外部参数。CFNet、DXQ-Net等。
-
(4)Keypoints(所以怎么又蹦出来个第四类):网络从输入数据中提取特征描述符,然后为每个 3D 关键点在图像上找到对应的 2D 点。最后,可以估计 LiDAR 和相机之间的外参。如:RGKCNet。
3.4.2 Hybrid‑learning methods(混合学习方法)
混合学习方法仅使用神经网络提取几何、语义特征等信息,而特征关联和外部参数计算过程仍然基于非学习方法。这个方法感觉还挺好的,感觉通过提升标定流程里模块的精度,说不定可以实现整体精度的提升
3.4.3 Summary of learning based methods
深度学习方法需要比较大的数据支撑,目前泛化能力还有待提升。
总结
文章针对现有的一些相机-雷达外参标定的方法进行了综述,整体总结还是非常全面的,但我个人觉得在一些分类上会有一些重叠,当然这和相机-雷达标定本身的性质也有一定关系;同时,由于相机雷达标定的特殊性,这里没有像一些其他领域的综述一样,会放一些数据性的指标,也就是没有量化对比的部分,所以看上去没有那么直观。这里没有对文章进行整体的翻译,还是以了解各类方法为主要目的。推荐大家去仔细翻阅下原文,对相机类大标定的一个大概进展能有比较直观的掌握。
相关文章:
相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
相机雷达外参标定综述--Automatic targetless LiDAR–camera calibration: a survey 前言1 Introduction2 Background3 Automatic targetless LiDAR–camera calibration3.1 Information theory based method(信息论方法)3.1.1 Pairs of point cloud and image attributes(属性…...
JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中
本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…...
分布式专题(10)之ShardingSphere分库分表实战指南
一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus,旨在…...
支付宝订单码支付
1.订单码支付,首先下载官方网站提供的sdk包到你的项目中。 2.选择控制器复制官方文档的获取二维码相关的代码示例。打开sdk包中v2的index.php文件,这个才是你选择语言的具体代码。 3.引用里面所需要的类文件,文件下载到你的项目中后…...
使用 Django 和 AWS ECR 实现容器化应用的管理
在现代云原生应用的开发和部署中,容器化技术已经成为主流。Amazon Elastic Container Registry (ECR) 是一种完全管理的 Docker 容器注册表服务,可以与 Amazon ECS、EKS 和其他容器服务无缝集成。在这篇文章中,我们将介绍如何使用 Django 和 AWS ECR 实现集成管理,包括创建、更…...
DeepWalk 原理详解
概述: DeepWalk 是一种流行的图嵌入方法,用于学习图结构数据中节点的低维表示。它通过将图的节点视作序列数据,利用自然语言处理中的技术(类似于word2vec算法)来捕捉节点间的关系,可以帮助我们理解和利用图…...
深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CmBN)
在训练深度神经网络时,批量归一化(Batch Normalization,简称BN)是一种常用且有效的技术,它帮助解决了深度学习中训练过程中的梯度消失、梯度爆炸和训练不稳定等。然而,BN也有一些局限性,特别是在…...
基于Spring Boot的雅苑小区管理系统
一、系统背景与意义 随着信息化技术的快速发展,传统的小区物业管理方式已经难以满足现代居民对于高效、便捷服务的需求。因此,开发一款基于Spring Boot的小区管理系统显得尤为重要。该系统旨在通过信息化手段,实现小区物业管理的智能化、自动…...
物理层知识要点
文章目录 物理层接口的四大特性通信基础编码和调制(1)数字数据编码为数字信号(2)模拟数据编码为数字信号(3)常见调制方式(3)信道的极限容量 多路复用技术数据传输方式物理层下的传输…...
项目里用到了哪些设计模式是怎么使用的?
在软件开发项目中,设计模式是解决特定问题的通用模板或最佳实践。它们提供了一种经过验证的方式来组织代码,使其更易于理解、维护和扩展。下面我将详细介绍一些常见的设计模式及其在项目中的应用方式。 1. 单例模式(Singleton Pattern&#…...
CPU性能篇-CPU 100%如何定位根因-Day 03
1. CPU使用率 1.1 关键指标介绍 user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。nice(通常缩写为 ni),代表低优先级用户态 CPU 时…...
访谈积鼎科技总经理:国产CFD软件发展与未来趋势展望
傅彦国,上海积鼎信息科技有限公司创始人 记者:请傅总介绍下我国流体仿真行业的发展现状是怎样的? 傅彦国:自2018年政府加大了对核心技术自主研发的支持力度,国产CFD软件逐渐步入发展正轨。 首先,从市场规…...
四种自动化测试模型实例及优缺点详解
一、线性测试 1.概念: 通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。 (操作,重复操作,数据)都混合在一起。 2.优点: 每个脚本相对独立,且不产生…...
数字后端培训项目Floorplan常见问题系列专题续集1
今天继续给大家分享下数字IC后端设计实现floorplan阶段常见问题系列专题。这些问题都是来自于咱们社区IC后端训练营学员提问的问题库。目前这部分问题库已经积累了4年了,后面会陆续分享这方面的问题。 希望对大家的数字后端学习和工作有所帮助。 数字后端项目Floor…...
NVIDIA GPU 内部架构介绍
NVIDIA GPU 架构 NVIDIA GPU 的 SM(Streaming Multiprocessor) 和 GPC(Graphics Processing Cluster) 是 GPU 架构中的关键组成部分。它们决定了 GPU 的计算能力和性能,以下是对这两个参数的详细介绍: 1. …...
[spring]实例化对象(静动态工厂)
在前面文章的例子当中,我们都创建了Bean对象。spring里常用的获取类的实例化对象有几种方式:构造函数获取Bean对象、静态和动态工厂获取Bean对象、实现FactoryBean规范。 因为一些步骤没有什么别的不同,所以我不会重复去讲,届时会…...
【转】arm64架构的银河麒麟系统Kylin的qt安装教程
转自:arm64架构的银河麒麟系统Kylin的qt安装教程_银河麒麟安装qt-CSDN博客 文章目录 前言 一、准备环境 安装C编译器和调试器 二、安装qt、qtcreator 检查是否已经安装过Qt组件 安装Qt组件和Qt creator 检查组件是否安装成功: 三、测试程序运行 报错 Qt…...
C# Main方法 和顶级语句详解
总目录 前言 Main方法 和顶级语句 介绍。 一、Main方法 1. 基本信息 Main 方法是 C# 应用程序的入口点。 Main 方法是应用程序启动后调用的第一个方法。C# 程序中只能有一个入口点。如果多个类包含 Main 方法,必须使用 StartupObject 编译器选项来编译程序&#…...
传输层协议分析头歌
第1关:TCP 包基础 本机使用的IP地址和TCP端口号(用;隔开):192.168.1.102;1161 gaia.cs.umass.edu的IP地址和端口号(用;隔开):128.119.245.12;80 第2关:三次握手 第一次握手,TCP SYN区段的序列号是:232129012 gaia.cs.umass.edu…...
JAVA AOP简单实践(基于SpringBoot)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
重温设计模式--迭代器模式
文章目录 迭代器模式(Iterator Pattern)概述迭代器模式的结构迭代器模式UML图C 代码示例应用场景 迭代器模式(Iterator Pattern)概述 定义: 迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个…...
Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表
短短几百行代码,好吧,又是“参考”了国外的月亮 操作,还真地挺自然的。。。。。。国外的实现有点小牛 拖拉,增加+ 一个Element 鼠标左键长按,可以出提示 鼠标右键,清除Element, 有点小bug,不是很自然地完全清除, using System.Collections; using System.Collecti…...
Android 11添加电容笔电量监测需求
软件平台:Android11 硬件平台:QCS6125 需求:PAD接入电容笔,该笔通过驱动上报坐标及当前电量等数据,即走系统的input通道,需要系统层监测到该硬件数据,这里主要展示电量,对用户显示提…...
迈向AGI——大模型创新体验嘉年华邀请函
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 深度对话,思想碰撞 大模型创新体验嘉年华诚邀您与我们共同见证 智见未来,只等你来 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,…...
VSCode 性能优化指南:提高编码效率,减少资源占用
Visual Studio Code(简称VSCode)是一款广受欢迎的代码编辑器,以其强大的功能和丰富的插件生态系统著称。然而,随着项目规模的扩大和插件数量的增加,VSCode 的性能可能会受到影响。本文将介绍一系列优化措施,…...
如何获取 ABAP 内表中的重复项
要识别 ABAP 内表中的重复项,可以结合使用排序和循环。下面的示例展示了如何查找内部表中的重复条目: DATA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE c LENGTH 10,END OF itab,wa LIKE LINE OF itab.* Add sample data to internal table it…...
android 登录界面编写
1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候,验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时,使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…...
3D-resnet 50 医学3D图像二分类python代码
离上次发布3D-resnet代码时隔两年,最近让AI推荐3D-resnet的文章给我,AI推荐了三篇 其中两篇是我两年前发的,另一篇在这里Resnet3D预训练网络...... 于是决定更新之前代码,供诸位参考1. 可以用cpu或gpu(推荐8G以上&…...
android sqlite 数据库简单封装示例(java)
sqlite 数据库简单封装示例,使用记事本数据库表进行示例。 首先继承SQLiteOpenHelper 使用sql语句进行创建一张表。 public class noteDBHelper extends SQLiteOpenHelper {public noteDBHelper(Context context, String name, SQLiteDatabase.CursorFactory fact…...
项目练习:若依-前端项目的目录结构介绍
文章目录 一、目录截图二、目录讲解 一、目录截图 二、目录讲解 1、首先,我们可以看到,这个VUE项目,只有一个App.vue,所以,它是一个单页面系统。 这个App.vue是根组件,root组件。 2、public目录 在Vue 3.…...
Android 之 List 简述
一、简单创建方式 Android 开发中,列表有很多种类,如ArrayList、LinkedList、List、MutableList等,创建列表的方式如下所示: fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…...
CV(6)-SIFT和Hash
前言 仅记录学习过程,有问题欢迎讨论 SIFT:尺度不变特征变换: SIFT提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。SIFT的应用范围包括物体辨别、机器人地图感知与导航、影像拼接、3D模型建立、手势…...
javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.13.13 not verified:
javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.13.13 not verified: 前言: 之前需求推送数据是采用http:192.168.13.13:8000 后面业务需求修改为 https:192.168.13.13:443 修改后推送数据到第三方报以下异常, https://192.168.13.13:443…...
用Unity做没有热更需求的单机游戏是否有必要使用AssetBundle?
在使用Unity开发没有热更需求的单机游戏时,是否使用AssetBundle(AB包)是一个值得探讨的问题。以下是对此问题的详细分析: 一、AssetBundle的概述 AssetBundle是Unity中用于存储和加载游戏资源的打包文件,可以包含各种…...
WebRTC Simulcast 大小流介绍与优化实践
Simulcast 是 WebRTC 中的一种标准化技术 ,简称大小流。通过 Simulcast,客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码,带宽较多的拉流端可以接收较高质量的视频流,带宽有限的拉流端则可以接收较…...
软件测试之测试用例
文章目录 测试用例测试用例的编写总结 测试用例 测试用例:描述测试点执行的文档(测试输入、执行条件、预期结果等) 作用 1.测试点能被精准执行 2.便于团队合作测试用例核心内容 用例编号、用例标题、所属模块、优先级、前置条件、测试步骤、测试数据、预期结果 测试用例的编写…...
Redis--通用命令学习
目录 一、引言 二、基础命令 1.set 2.get 3.keys 3.1 keys ? 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的过期策略(面试题) 1.惰性删除 2.定期删除 …...
自动控制系统综合与LabVIEW实现
自动控制系统综合是为了优化系统性能,确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW,可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法,并结合硬件选型提供实…...
一篇文章学会HTML
目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...
48页PPT|2024智慧仓储解决方案解读
本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先,从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策,这些政策强调了自动化、标准化、信息化水平的提升,以及智能化立体仓库的建设࿰…...
React Props 完整使用指南
React Props 完整使用指南 1. 类组件中的 Props 1.1 基本使用 // 父组件 class ParentComponent extends React.Component {render() {return (<ChildComponent name"John"age{25}isStudent{true}hobbies{[reading, swimming]}/>);} }// 子组件 class Child…...
金融数据可视化实现
一、设计题目 金融数据可视化 二、设计目的 使学生掌握用Pandas第三方库数据计算、数据分析的知识与能力。Pandas是专门用于数据分析的库,其提供的read_excel()方法可以方便的读取xlsx格式的文件中的数据到Pandas中的DataFrame中。 DataFrame.plot(kindline)&am…...
逆袭之路(6)——解析数据世界的灵动基石——变量
困厄铸剑心,逆袭展锋芒。 寒苦凝壮志,腾跃绘华章。 我要逆袭。 目录 一、引言 二、变量的定义 三、变量的性质 (一)可变性 (二)有界性 (三)关联性 四、变量的类型 ÿ…...
【云原生】kubeadm搭建的kubernetes1.28集群上自建ingress-nginx服务
1、查询兼容性 先确认下kubernetes版本与ingress-nginx版本兼容性 Ingress-NGINX 版本支持的 k8s 版本Alpine 版本Nginx 版本Helm Chart 版本v1.12.0-beta.01.31, 1.30, 1.29, 1.283.20.31.25.54.12.0-beta.0v1.11.31.30, 1.29, 1.28, 1.27, 1.263.20.31.25.54.11.3v1.11.21.3…...
分布式协同 - 分布式事务_TCC解决方案
文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC(Two-Phase Commit,二阶段提交)3PC(Three-Phase Commit,三阶段提交)TCC(Try-Confirm-Cancel)2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…...
两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器
问题原因 remote-ssh还是有一些bug的,在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号,到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了...
SpringBoot3整合FastJSON2如何配置configureMessageConverters
在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤,包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤: 1. 添加依赖 首先,你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…...
数据库安全-redisCouchdb
1.redis未授权访问 默认端口:6379 1.1 Redis沙盒逃逸漏洞RCE-CVE-2022-0543 介绍:Redis 是一套开源的使用 ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。Redis 如果在没有开启认证的情况下,…...
java如何使用poi-tl在word模板里渲染多张图片
1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义…...
ASP.NET |日常开发中常见问题归纳讲解
ASP.NET |日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态(在ASP.NET Web Forms 中) 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击(XSS) 三、状态管理问题3.1 会话状态(Session …...