点云配准

2023-11-15

 

目录

一、点云配准概念

二、点云配准分类

1. 无辅助的自动拼接

2. 人工辅助标志点

三、配准常见流程

1. 粗配准

2. 精配准

(1)奇异值分解求解

(2)四元素求解旋转矩阵

参考文献


一、点云配准概念

       由于三维扫描测量设备受测量方式的限制和被测物体集合形状的限制,一次只能扫描被测物体有限范围的点云数据,这需要在多个视角下进行多次扫描,然而每个视角下得到点云数据都具有独立的坐标系,无法直接进行拼接。于是需要通过对每个视角下获取点云进行坐标转换,统一到全局坐标系下。具体流程是通过一个点集(目标)中的每一个点与另一个点集(原始点集)中的对应点的相互关系来实现点集与点集坐标系之间的转换,实现配准。 

具体实现步骤:

(1)首先从两片点云数据中按照同样的关键点选取标准,提取关键点 ;

(2)对选择的所有关键点分别计算其特征描述子;

(3)结合特征描述子在两个数据集中的坐标的位置,以两者之间特征和位置的相似度为基础,来估计它们的对应关系,初步估计对应点对;

(4)假定数据是有噪声的,除去对配准有影响的错误的点对应点对;

(5)利用剩余的正确对应关系来估算刚体变化,求解对应旋转矩阵和平移矩阵,完成配准构成。

二、点云配准分类

        国内外许多学者都对其进行了深入的研究,也取得了丰硕的研究成果。应用较为广泛是迭代最近点、基于几何特征匹配、基于图像灰度的配准等。这些配准算法所用到的几何原理主要包括刚性变换、投影变换、放射变换和曲线变换。虽然每种配准算法的原理不同,但配准的流程都相差不大,主要分为:点云数据的提取、点云数据的匹配、除错处理和变换求解。

1. 无辅助的自动拼接

针对特征明显的被测物体,使用其他手段进行配准、
(1)迭代最近点(ICP):从一片点云中搜索到另外一片点云中最近点来确定对应点集,容易陷入局部最优解,且要求配准两片点云初始位置与真实位置相差不大,其实质是基于最小二乘法的最优匹配方法。主要分为点对点,点对投影和点对面的方法。

(2)特征点匹配:通过分析被测物体的局部几何信息来寻找特征点并实现匹配,但算法特征点包含较少几何信息,稳定性有待提高。可以利用多尺空间尺度不变特征变化(SIFT)来寻找特征点,这要求被测物体有纹理信息,基于SIFT算法在空间寻找极值点,并提取其位置、尺度、旋转不变量进行特征点匹配。

(3)正态分布变换(NDT):利用高斯概率分布的形式来描述离散点的信息,用标准最优化技术确定最优匹配,具有收敛速度快,效率高的特点,常常用来做精配准,结合其他算法一起使用。

(4)依靠平台实现配准:通过扫描设备和旋转平台之间的相对位置,通过旋转平台运动参数来计算各个点云视角下旋转矩阵,实现将任意角度的点云配准到统一坐标系下,该方法配准精度高,但受旋转平台定位装置精度的影响。

2. 人工辅助标志点

针对被测物体没有明显的特征点,从不同的视角拍摄无法对同一点进行有效的识别定位,需要人工添加标志点在被测物体上,进而完成测量。这种方式更加灵活、适用于任何形状的物体。

(1)编码标志点:标志点自身带有唯一的编码信息,每个标志点都对应不同的编码信息,且对于不同的编码标志点有对应不同的编解码方案和特征识别算法,通过在两幅不同视场下相同的标志点实现自动拼接。

(2)非编码标志点:标志点的大小形状完全相同,可以通过对三点法、四点法、四元法、SVD最小二乘法实现点云配准。但由于噪声的影响标志点位置布置的随机性,在标志点匹配时非常同意出现误匹配标志点,影响点云配准的稳定性。

 

三、配准常见流程

       通过一个点集(目标)中的每一个点与另一个点集(原始点集)中的对应点的相互关系来实现点集与点集坐标系之间的转换,实现配准。 

两幅点云数据中对应点的坐标关系可以描述如下:q=R_3_X_3p+T_3_X_1

其中其中R_3_X_3(R)是对应点旋转矩阵,T_3_X_1(T)是对应点平移矩阵。

估算变换矩阵的步骤:

(1) 在对应关系的基础上评估一些错误的度量标准(使用对应点的欧式距离为度量标准);

(2)利用最小化错误标准和矩阵运算等来估计一个刚性变换;

(3)使用刚性变换将源点云旋转/平移到与目标所在的同一个坐标系下,然后再用所有对应点或者部分对应点、关键点运行一个内部ICP循环;

(4)进行迭代,直到符合收敛性判断标准为止(一般设置对应点的欧氏距离作为终止迭代的阈值)

       求解旋转矩阵可以通过在两个点云集中寻找对应点对,根据对应点对来建立转换方程组,通过求解方程组的值来计算出旋转矩阵R和平移矩阵 H。理论上最少需要找到三组不共线的对应点对才能求解出旋转平移矩阵,不过为使结果更加精确,对应点对越多越好。但一般情况下,很难在两幅点云数据中很准确的找到对应点对,因此加入目标函数,使目标函数最优来估计旋转、平移矩阵。目前,最常用的目标函数是对应点欧式距离平方和:

                                                                  f(H)=f(R,T)=\sum_{i=1}^{k}\left \| q_i-Rp_i-T \right \|

         大部分点云配准算法可以从不同角度对其进行划分:从局部与整体的角度进行划分时,可以分为局部配准与全局配准;从配准精确度高低的角度进行划分时,可以分为粗配准与精确配准。虽然划分的方式不同,但不同角度之间是相互对应的,全局配准与粗配准对应,局部配准与精确配准对应。、

        大多是点云数据的配准主要基于迭代最近点算法。由于迭代最近点算法对待配准的两片初始点云有较高的重叠度要求,因此在精确配准之前要进行粗配准。通过粗配准可以得到矩阵变换参数,进而将待配准点云数据转换到统一坐标系内,为精确配准提供一个较好的初始位置。

1. 粗配准

        粗配准是为了后续ICP精配准做准备,初步对两片初始点云进行配准,可到平移矩阵和旋转矩阵的初始值,进而将待配准点云数据转换到统一坐标系内,为精确配准提供一个较好的初始位置。根据被测物体本身所具有的特点不同,较为常见的粗配准方法有:标签法、基于平台配准和曲率特征法。 

(1)标志点:通过人为的在被测物体表面贴标签,将这些标签作为被测物体的特征点,在对多次测量得到的点云数据进行配准时,通过对特征点的进行识别与配准,代替了对整体点云数据的配准,简化了点云数据的配准过程。

       标志点缺点是对测物体进行贴标签的操作比较繁琐,过程比较耗时,并且对文物类的实体进行测量时,有可能产生不同
程度的损坏。

(2)基于平台配准:将被测物体放在平台之上,利用控制器对平台进行控制,使得平台进行固定角度的转动,通过对同一位置的多次测量便可得到不同视角下的点云数据,进而实现对被测物体的点云配准。

       基于平台配准主要适用于那些尺寸比较小且不适合贴标签的物体。

(3)曲率特征法:通常用于被测物体的表面几何特征较为明显的情况,因为曲率是空间几何里的一个不变特征量,所以通过曲率值的计算可以确定两片点云的对应点对,进而利用得到的对应点对求解变换矩阵的未知参数,完成点云的粗配准。

2. 精配准

        ICP由于具有计算简便直观,配准精度高等优点被广泛应用于点云的精配准中。但该算法的运行速度以及向全局最优化的收敛性却在很大程度上依赖于给定的初始变换估计以及在迭代过程中对应关系的确立。所以需要各种粗配准技术为ICP算法提供较好的位置,在迭代过程中确立正确对应点集能避免迭代陷入局部极值,决定了算法的收敛速度和最终的配准精度。

       ICP处理流程:(1)对原始点云数据进行采集;(2)确定初始对应点集;(3)去除错误点对应点对;(4)变换矩阵的求解。

       首先是从源点云中搜索到目标点云中最近点来确定对应点集q和p,然后通过最小二乘法迭代求解最优旋转矩阵R和平移矩阵T,使得误差E最小:

                                                                     E(R,T)=\frac{1}{n}\sum_{i=1}^{n}\left \| q_i-(Rp_i+T)) \right\|^2

        其中n代表对应点对的数目,ICP算法具有计算简单且配准精度高的优点,但是该算法对于两片点云的初始位置要求较为严格,否则容易陷入局部收敛且会影响配准速度,因此需要通过粗配准来为ICP提供较好的点云初始位置。

        常用求取目标函数最小的旋转矩阵和平移矩阵的方法主要分为四元数法奇异值分解法

(1)奇异值分解求解

由最小二乘法可知目标函数E(R,T)=min

                                                                E(R,T)=\frac{1}{n}\sum_{i=1}^{n}\left \| q_i-(Rp_i+T)) \right\|^2=min

求两组点云集的重心:

                                                                         C_q=\frac{1}{n}\sum_{i=1}^{n}q_i            C_p=\frac{1}{n}\sum_{i=1}^{n}p_i

由最小二乘法可知:C_q=RC_p+T,并定义d_q_i=q_i-C_q,d_p_i=p_i-C_p,于是目标函数可以变为:

                                       E(R,T)=\frac{1}{n}\sum_{i=1}^{n}\left \| q_i-(Rp_i+T)) \right\|^2=\frac{1}{n}\sum_{i=1}^{n}\left \| d_q_i+C_q-[R(d_p_i+C_p)+T] \right\|^2

                                                      =\frac{1}{n}\sum_{i=1}^{n}\left \| d_q_i-Rd_p_i \right\|^2

                                                     =\frac{1}{n}\sum_{i=1}^{n}(d_q_i^T d_q_i+d_p_i^TR^T Rd_p_i-2 d_q_i^TR d_p_i)

因为第一项与R无关,第二项由于R^TR=I与R无关(R为正交矩阵),那么目标函数可以转化为求\sum_{i=1}^{n}(d_q_i^TR d_p_i)的最大值。

                                                           \sum_{i=1}^{n}(d_q_i^TR d_p_i)=\sum_{i=1}^{n}tr(R d_p_id_q_i^T)=tr(R\sum_{i=1}^{n}d_p_id_q_i^T)

                                                                                        H=\sum_{i=1}^{n}d_p_id_q_i^T

假设存在最优解R^*,则存在下面关系:

                                                                            tr(R^*H)\geqslant tr(RH)=tr(BR^*H)

则然后对H矩阵进行奇异值分解(SVD) 

                                                                              H=U\sum V^T

于是可以得到最优解R^*

                                                                                 R^*=VU^T

其中需要H满秩,同时需要det(R^*)=1。然后通过C_q=RC_p+T可以求得平移矩阵T。

(2)四元素求解旋转矩阵

        前提背景:三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。于是我们可以用一个四维向量\left ( \theta, x,y,z \right )就可以表示出三维空间任意的旋转。这里的三维向量\left ( x,y,z \right )只是用来表示Axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向Axis,而用该三维向量的长度来表示角度值θ。于是就可以用一个三维向量\left ( \theta \ast x, \theta \ast y,\theta \ast z\right )就可以表示出三维空间任意的旋转。

单位向量\left ( x,y,z \right )旋转θ角度后的四元数:

                                                                  \left ( \cos\frac{\theta }{2} ,x\ast \sin\frac{\theta }{2},y\ast \sin\frac{\theta }{2},z\ast \sin\frac{\theta }{2}\right )

对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

根据上面的背景,我们可以定义一个单位四元数来表示旋转:

                                                                      q=q_{0}+q_{1}i+q_{2}j+q_{3}k=\left [ s,v \right ]

                                                                        \left | q \right |=\sqrt{q_{0}^{2}+q_{2}^{2}+q_{3}^{2}+q_{4}^{2}}

其中q_{0},q_{1},q_{2},q_{3}均为实数, s=q_{0},x=\left [ q_{1},q_{2},q_{3} \right ],i^{2}=j^{2}=k^{2}=-1
对于i,j,k本身的几何意义可以理解为一种旋转,其中i代表 x 轴与 y轴相交平面中 xx轴正向向 y 轴正向的旋转,j旋转代表 z 轴与 x 轴相交平面中 z轴正向向 x轴正向的旋转,k旋转代表 y 轴与 z 轴相交平面中 y 轴正向向 z 轴正向的旋转,-i,-j,-k分别代表i,j,k的反向旋转。

四元数性质:

单位四元数的共轭和逆相等:q^{-1}=q^{\ast }

四元数的乘法:q=\left [ s_{1},v _{1}\right ]=\left ( a_{1},b_{1},c_{1},d_{1} \right )^{T}p=\left [ s_{2},v _{2}\right ]=\left ( a_{2},b_{2},c_{2},d_{2} \right )^{T}

                 \small q\times p=\begin{pmatrix} a_{1}a_{2}-b_{1}b_{2}-c_{1}c_{2}-d_{1}d_{2}\\ a_{1}b_{2}+b_{1}a_{2}+c_{1}d_{2}-d_{1}c_{2}\\ a_{1}c_{2}-b_{1}d_{2}+c_{1}a_{2}+d_{1}b_{2}\\ a_{1}d_{2}+b_{1}c_{2}-c_{1}b_{2}+d_{1}a_{2} \end{pmatrix}=\begin{pmatrix} a_{2}& -b_{2}& -c_{2} & -d_{2}\\ b_{2}& a_{2}& d_{2}& -c_{2}\\ c_{2}& -d_{2}& a_{2}& b_{2}\\ d_{2}& c_{2}& -b_{2}& a_{2} \end{pmatrix}\times \begin{pmatrix} a_{1}\\ b_{1}\\ c_{1}\\ d_{1} \end{pmatrix}=Qq

                \small p\times q=\begin{pmatrix} a_{2}a_{1}-b_{2}b_{1}-c_{2}c_{1}-d_{2}d_{1}\\ a_{2}b_{1}+b_{2}a_{1}+c_{2}d_{1}-d_{2}c_{1}\\ a_{2}c_{1}-b_{2}d_{1}+c_{2}a_{1}+d_{2}b_{1}\\ a_{2}d_{1}+b_{2}c_{1}-c_{2}b_{1}+d_{2}a_{1} \end{pmatrix}=\begin{pmatrix} a_{2}& -b_{2}& -c_{2} & -d_{2}\\ b_{2}& a_{2}& -d_{2}& c_{2}\\ c_{2}& d_{2}& a_{2}& -b_{2}\\ d_{2}& -c_{2}& b_{2}& a_{2} \end{pmatrix}\times \begin{pmatrix} a_{1}\\ b_{1}\\c_{1}\\d_{1} \end{pmatrix}=\overline{Q}q

由上式可以得知四元数不具备有乘法交换律性质。

        根据上面介绍背景和四元数的性质,假设三维空间点云中某个数据点\small P=\left ( P_{ix},P_{iy},P_{iz} \right )的四元数的形式:

                                                                      \small P=0+P_{ix}i+P_{iy}j+P_{iz}k

        设过原点的旋转轴的单位方向向量为\small \omega =\left ( \omega_{x} ,\omega_{y} ,\omega_{z} \right )^{T},某点P绕旋转轴旋转\small \theta角度后得到了\small P^{*},此旋转过程的四元数表示形式为:

                                      q=q_{0}+q_{1}i+q_{2}j+q_{3}k=\cos \frac{\theta }{2}+\sin \frac{\theta }{2}\omega_{x}i+\sin \frac{\theta }{2}\omega_{y}j+\sin \frac{\theta }{2}\omega_{z}k

由于采用单位四元数的表达形式,所以q\cdot q=1,而且q^{-1}=\overline{q}

因此点\small P与点\small P^{*}满足以下关系:

                                                      \small P^{*}=q\times P\times q^{-1}=q\times P\times \overline{q}=\left ( Qq \right )\times \overline{q}=\left ( Q^{T} \overline{Q}\right )\times P

联立上面四元数的乘法两条公式可以得到如下关系:

                                         \small Q^{T}\overline{Q}=\begin{bmatrix} q\cdot q & 0 & 0 &0 \\ 0 & q_{0}^{2}+q_{1}^{2}-q_{2}^{2}-q_{3}^{2}& 2\left ( q_{1}q_{2}-q_{0}q_{3}\right ) & 2\left ( q_{1}q_{3}+q_{0}q_{2}\right ) \\ 0 & 2\left ( q_{1}q_{2}+q_{0}q_{3}\right ) & q_{0}^{2}-q_{1}^{2}+q_{2}^{2}-q_{3}^{2}& 2\left ( q_{2}q_{3}-q_{0}q_{1}\right )\\ 0 & 2\left ( q_{1}q_{3}-q_{0}q_{2}\right )& 2\left ( q_{2}q_{3}+q_{0}q_{1}\right )& q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2} \end{bmatrix}

        为了消除符号歧义,\small Q,\overline{Q}中符号\small a_{2},b_{2},c_{2},d_{2}均用\small q_{0},q_{1},q_{2},q_{3}。通过对比旋转矩阵\small R_{3\times 3}的形式,可以得出用四元数形式表示的旋转矩阵:

                                           \small R_{3\times 3}=\begin{bmatrix} q_{0}^{2}+q_{1}^{2}-q_{2}^{2}-q_{3}^{2}& 2\left ( q_{1}q_{2}-q_{0}q_{3}\right ) & 2\left ( q_{1}q_{3}+q_{0}q_{2}\right ) \\ 2\left ( q_{1}q_{2}+q_{0}q_{3}\right ) & q_{0}^{2}-q_{1}^{2}+q_{2}^{2}-q_{3}^{2}& 2\left ( q_{2}q_{3}-q_{0}q_{1}\right )\\ 2\left ( q_{1}q_{3}-q_{0}q_{2}\right )& 2\left ( q_{2}q_{3}+q_{0}q_{1}\right )& q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2} \end{bmatrix}

 

       利用四元数作为旋转向量的表示优势:不需要考虑多个轴的旋转顺序且复杂计算,只用绕一个轴旋转角度来表示整体的旋转,计算较为简单;且能避免由于建立在物体坐标系上导致万向节死锁。唯一缺点是多引入一个变量,但这并不影响旋转矩阵的确定。

根据上文推导,对于两片点云之间的高精度配准是通过最小二乘法迭代求解最优旋转矩阵R和平移矩阵T,使得误差E最小:

                                                                     E(R,T)=\frac{1}{n}\sum_{i=1}^{n}\left \| q_i-(Rp_i+T)) \right\|^2

求两组点云集的重心:

                                                                         C_q=\frac{1}{n}\sum_{i=1}^{n}q_i            C_p=\frac{1}{n}\sum_{i=1}^{n}p_i

然后对两片点云做去中心化处理后,求出两片点云3\times 3的协方差矩阵:

                                                                         C_{qp}=\frac{1}{n}\sum_{i=1}^{n}\left ( q_{i}-C_{q} \right )\left ( p_{i}-C_{p} \right )^{T}

并假设对称矩阵:A_{ij}=\left ( C_{ij-}C_{ij}^{T} \right)_{ij}

由此可以得到列向量为:\Delta =\left [ A_{23} ,A_{31} , A_{12} \right ]^{T}

利用该列向量构建4X4对称矩阵:

                                                                   B=\begin{bmatrix} tr\left ( C_{qp} \right ) & \Delta ^{T}\\ \Delta & C_{qp}+C_{qp}^{T}-tr\left ( C_{qp} \right )I_{3} \end{bmatrix}

      其中,tr\left ( C_{qp} \right )表示矩阵C_{qp}的迹,即主对角线元素的综合,也是特征值之和,I_{3}表示3\times 3的单位矩阵。所以将上面矩阵B进一步计算可以得到如下方程:

\small B=\begin{bmatrix} C_{qp}\left ( 1,1 \right ) +C_{qp}\left ( 2,2 \right )+C_{qp}\left ( 3,3\right )& C_{qp}\left ( 2,3 \right )-C_{qp}\left ( 3,2 \right ) &C_{qp}\left ( 3,1 \right )-C_{qp}\left ( 1,3 \right ) & C_{qp}\left ( 1,2 \right )-C_{qp}\left ( 2,1 \right )\\ C_{qp}\left ( 2,3 \right )-C_{qp}\left ( 3,1 \right )&C_{qp}\left ( 1,1 \right )-C_{qp}\left ( 2,2 \right )-C_{qp}\left ( 3,3 \right ) & C_{qp}\left ( 1,2 \right )+C_{qp}\left ( 2,1 \right ) & C_{qp}\left ( 1,3 \right )+C_{qp}\left ( 3,1 \right )\\ C_{qp}\left ( 3,1 \right )-C_{qp}\left ( 1,3 \right ) & C_{qp}\left ( 1,2\right )+C_{qp}\left ( 2,1 \right )&C_{qp}\left ( 2,2 \right )-C_{qp}\left ( 1,1 \right )-C_{qp}\left ( 3,3 \right ) &C_{qp}\left ( 2,3 \right )+C_{qp}\left ( 3,2 \right ) \\ C_{qp}\left ( 1,2 \right )-C_{qp}\left ( 2,1 \right )& C_{qp}\left ( 1,3 \right )+C_{qp}\left ( 3,1 \right ) & C_{qp}\left ( 2,3 \right )+C_{qp}\left ( 3,2 \right ) & C_{qp}( 3,3)-C_{qp}\left ( 1,1 \right )-C_{qp} ( 2,2) \end{bmatrix}

       然后对矩阵B做特征值和特征向量求解,求出最大的特征值以及其对应的特征向量,那个特征向量就对应误差的平方和最小时的四元数。(这个我也不是很清楚,为什么这个特征向量就对应误差平方和最小时的四元数???) 

      求出四元数的四个变量值:q=\left [ q_{0},q_{1},q_{2},q_{3} \right ]^{T}。并且将其四个值带入到上式的旋转矩阵R中,求解最优的旋转矩阵。在选择矩阵确定后,根据公式T=C_{q}-RC_{p},就容易求解出平移矩阵。计算目标函数如下式,如果结果小于阈值则停止迭代,否则继续重复前面的步骤。

 

参考文献

1.SVD求解ICP:https://blog.csdn.net/zhouyelihua/article/details/77807541

2.四元数性质:https://blog.csdn.net/lql0716/article/details/72597719

3.四元数求解ICP:https://blog.csdn.net/hongbin_xu/article/details/80537100

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

点云配准 的相关文章

  • (Java)leetcode-148 Sort List(排序链表)

    题目描述 在 O n log n 时间复杂度和常数级空间复杂度下 对链表进行排序 示例 1 输入 4 gt 2 gt 1 gt 3 输出 1 gt 2 gt 3 gt 4 示例 2 输入 1 gt 5 gt 3 gt 4 gt 0 输出 1
  • Unity中物体跟随另一个物体移动,且他们不是父子关系

    更新啦 我找到解决办法啦 经过我做出的无数的无用功之后 终于在学长的指导下找到了解决办法 之前说的问题如下 在一个项目中想要如题目要求的效果 A随着B位置发生变化很好做 就是 A transform position Vector3 Mov
  • 音视频开发(40)---麦克风阵列声源定位 GCC-PHAT

    麦克风阵列声源定位 GCC PHAT 版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net u010592995 article details 79735198 麦克风阵列声源定位 一 利用麦克风阵列
  • 数据校验(CRC 原理、LRC、奇偶校验、校验和)

    数据校验 数据在传输的过程中 会受到各种干扰的影响 如脉冲干扰 随机噪声干扰和人为干扰等 这会使数据产生差错 为了能够控制传输过程的差错 通信系统必须采用有效措施来控制差错的产生 并保证数据的完整性 如下所示的传输错误 奇偶校验 奇偶校验是
  • 使用django的APP在前端上传excel通过post传给后端读取并打印

    文章目录 前言 前端 后端 前言 备研了 博客许久未更了 但是学期末的大作业 遇到了问题并成功解决了 不得不记录一下 前端
  • 关系数据库的由来

    关系数据库的由来 1970年 IBM的研究员E F Codd博士在刊物 Communication of the ACM 上发表了一篇名为 A Relational Model of Data for Large Shared Data B
  • vscode跳转到定义的问题

    vscode php怎么设置跳转到定义的搜索范围 我的现在只能跳转到当前文件所在项目内的定义处 我希望能直接在工作区内所有文件中查找函数的定义
  • Ubuntu搭建SMB服务器,并共享文件夹

    一 Ubuntu安装步骤 1 ubuntu安装samba sudo apt get install samba 2 创建文件夹 home share 并修改权限为777 mkdir home share chmod 777 home sha
  • STM32 GPIO速度,模式等理解

    一 GPIO模式配置 1 输入 输出模式 参考stm32手册 2 GPIO输出模式下 几种速度的区别 1 GPIO 引脚速度 GPIO Speed 2MHz 10MHz 50MHz 又称输出驱动电路的响应速度 芯片内部在I O口的输出部分安
  • EAS BOS后端代码调用BOTP生成下游单据(备忘)

    BOS开发再服务端调用BOTP生成目标单据 记录下 自用备忘 Override protected void audit Context ctx IObjectValue model throws BOSException try this
  • 0-1背包问题(双限制条件)

    给定n种物品和一个背包 物品i的重量是wi 体积是bi 其价值为vi 背包的容量为c 容积为d 问应如何选择装入背包中的物品 使得装入背包中物品的总价值最大 在选择装入背包的物品时 对每种物品只有两个选择 装入或不装入 且不能重复装入 输入
  • 华为校招机试 - 发广播(Java)

    题目描述 某地有N个广播站 站点之间有些有连接 有些没有 有连接的站点在接受到广播后会互相发送 给定一个N N的二维数组matrix 数组的元素都是字符 0 或者 1 matrix i j 1 代表i和j站点之间有连接 matrix i j
  • 使用R语言和LSTM实现时间序列异常检测

    目录 引言 长短期记忆网络 LSTM 时间序列异常检测的步骤 准备工作 数据获取
  • ES6 Iterator

    不同数据集合怎么用统一的方式读取 可以用for of循环了 转载于 https www cnblogs com moneyss p 10641507 html
  • 双向链表,单向链表//循环

    head h ifndef HEAD H define HEAD H include
  • 将Oracle zip安装文件转换成Linux可用的iso镜像

    在Oracle官网下载得到的zip安装文件 要在VMware虚拟机上挂载iso安装Oracle 所以想将zip文件转化为iso 除了使用UltraISO软件外 这里尝试使用Linux mkisofs命令生成ISO 9660文件 mkisof
  • IOS 网络初探(一) - NSURLConnection

    在IOS中 除了最基本的socket外 苹果提供了NSURLConnection类来实现网络通信 请求服务器数据 GET方式 请求服务器数据分成异步和同步两种方式 先来看看异步 非阻塞 NSURL url NSURL URLWithStri
  • LPDDR4 JEDEC标准测试实例解析--写操作

    在LPDDR4的JEDEC标准中 写操作相关的时序参数要求基本都是围绕DQS信号 如下图所示 图中的单位 tCK 指的是时钟信号的工作周期 tCK的测试方法如下图所示 Write preamble and postamble设置 这一步对于
  • 3.1 Git 分支 - 分支简介

    3 1 Git 分支 分支简介 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 23 初稿 目录 文章目录 3 1 Git 分支 分支简介 版本说明 目录 1 分支简介 Figure 9 首次提交对象及其树结构 Figur
  • Pycharm

    运行该程序 窗口底部会出现终端面板 Terminal pane 显示你的代码输出结果 使用Pycharm在运行过程中 查看每个变量的操作 show variables pytharm能不能像MATLAB一样显示中间变量的值呢 答案是可以的

随机推荐

  • Vue3.0 组合式 API 分析与实践

    本文带大家深入理解组合式 API 的设计详情 同时加入我们的实践经验总结 01 背景 Vue3 x 版本的出现带来了许多令人眼前一亮的新特性 其中组合式 API Composition API 一组附加的 基于功能的 API 被作为一种新的
  • 51单片机学习之-中断

    中断 在51单片机中共5个中断源 分别为 总的来说分为内部中断与外部中断 先说内部中断 也就是上图的两种定时器中断 T0 T1 它们的使用与4个寄存器有关 现在来介绍四种寄存器 中断允许寄存器 中断优先级寄存器 定时器工作方式寄存器 定时器
  • 151. 反转字符串中的单词

    1 题目地址 151 反转字符串中的单词 2 题目描述 给你一个字符串 s 请你反转字符串中 单词 的顺序 单词 是由非空格字符组成的字符串 s 中使用至少一个空格将字符串中的 单词 分隔开 返回 单词 顺序颠倒且 单词 之间用单个空格连接
  • vba与python的优缺点_对比VBA学Python操作Excel

    关于先学VBA还是先Python 或者作为办公族选什么 这些问题 我已经写了专题 就不再啰嗦 建议先阅读 讨论 学习VBA还是Python 但是大家一直还是被Python吸引 所以小编就说一期Python操作Excel吧 大部分教编程的 对
  • tensorflow 混合精度训练相关报错

    如题 在混合精度开发的时候遇到的报错 先列环境 V100服务器 ubuntu16 04 tensorflow 1 14 0 cuda10 0 python3 6 报错一 ValueError opt must be an instance
  • MySQL进阶语句

    目录 常用查询 order by按关键字排序 升序排序 降序排序 结合where进行条件过滤再排序 多字段排序 and or判断 and or 且与或的使用 嵌套 多条件使用 distinct 查询不重复记录 GROUP BY对结果进行分组
  • 经济,jiaxi

  • moviepy音视频开发:音频合成类CompositeAudioClip介绍

    前往老猿Python博文目录 CompositeAudioClip是AudioClip的直接子类 用于将几个音频剪辑合成为一个音频剪辑 CompositeAudioClip类只有一个构造方法 在构造方法内定义了一个内嵌函数make fram
  • 蓝屏错误代码分析和解决方法

    文字代码 可能的原因 可尝试的解决方法 0x00000001 APC INDEX MISMATCH 驱动出现问题 或安装了错误 不兼容的驱动 更新 重新安装相应设备官网的驱动 0x00000005 INVALID PROCESS ATTAC
  • VSCode的Pettier插件原理和设置

    最近写了一个 Prettier 插件 可以达到这样的效果 同事每次保存代码的时候 import 语句的顺序都会随机变 但是他去 prettier 配置文件里还啥也发现不了 于是就会一脸懵逼 那么这个同事发现了会打你的 prettier 插件
  • 在生信中利用Chat GPT/GPT4

    论文链接Ten Quick Tips for Harnessing the Power of ChatGPT GPT 4 in Computational Biology Papers With Code 之前在paper with cod
  • JAVA-JDK8的特性之Lambda表达式

    1 Lambda表达式 2 函数式接口 3 方法引用 4 Stream流 5 日期时间类 1 Lambda表达式 1 1 Lambda的由来 package demo01 public class Test01 public static
  • 从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包

    写在前面的话 不觉中已经在数码工作了十年有余 十年的青春 十年的汗水 如今即将离开 个中滋味难以言表 以后可能不会在广电行业工作了 就用这个小程序 为自己十年的广电工作画上一个句号吧 依旧是 版权没有 盗版不纠 欢迎转载 本程序的功能 提取
  • Linux中Crontab(定时任务)命令详解及使用教程

    Crontab介绍 Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中 用于设置周期性被执行的指令 该命令从标准输入设备读取指令 并将其存放于 crontab 文件中 以供之后读取和执行 该词来源于希
  • altium designer 画箭头

    一直在网上找如何在altium designer 中画箭头 没有结果 实然想到在AD的元件库中有不少元件是有箭头的 如果打开库文件 不就能看其属性了吗 于是选择Miscellaneous Devices IntLib打开做 试验 在打开时会
  • 萌新养成

    金三银四跳槽季 这个时候需要做好准备的可不仅仅只有在职或者离职的萝卜 尚未毕业的萌新也需要提早做准备了 毕竟把自己修炼成一个优秀的萝卜也不是一件容易的事 所以 放下你找对象 刷副本 世界游的想法 加入我们为你量身定制的人才培养计划 加入营长
  • lambda函数详解

    lambda函数的使用 捕获列表 常量性区别1 常量性区别2 lambda函数的实现 注意事项 lambda函数的使用 lambda函数的完整形式如下 capture parameters mutable gt return type st
  • K近邻估计

    Kn 近邻估计 KN近邻估计基本思想 预先确定n的某个函数Kn 然后再x点周围选择一个区域 调整区域体积大小 直至Kn个样本落入区域中 这些样本被称为点x的Kn个最近邻 如果x点附近的密度比较高 则V的体积自然就相对较小 从而可以提升分辨力
  • Maven下载与安装

    Maven下载 Maven官网 https maven apache org 进入官网 点击Download 可以看见4个文件 apache maven 3 8 7 bin tar gz是Linux版安装的 apache maven 3 8
  • 点云配准

    目录 一 点云配准概念 二 点云配准分类 1 无辅助的自动拼接 2 人工辅助标志点 三 配准常见流程 1 粗配准 2 精配准 1 奇异值分解求解 2 四元素求解旋转矩阵 参考文献 一 点云配准概念 由于三维扫描测量设备受测量方式的限制和被测