当前位置: 首页 > news >正文

双目视觉标定——1原理与实践

0 前言

双目视觉定位是目前机器(机器人)等领域中使用得非常广泛的视觉定位技术,双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算,所以双目相机装配要求高、标定也比单目复杂。相机的标定是定位的基础标定,本文是我学习双目视觉标定方法以及的总结文档。

1 为什么要标定?

作为初学者,我们会有疑问,什么相机需要进行标定,标定到底有什么用呢?这是因为摄像机是将三维世界投射到二维平面的设备,从三维世界的场景到二维平面的成像图像,这两者的转化存在着一种映射关系,不同的相机映射关系不同,所以他们对相同场景所成像的图像也就不同,而标定的目的就是确定相机的这种映射关系。

总体来说,通过标定能够确定相机的内参、外参、畸变系数这三类参数,而这些参数就是确定相机将三维世界转为二维图像的最主要因素;而双目相机还要确认两个摄像头之间的位置关系,这是双目用于计算物体位置的前提。

1.1相机标定要标定什么?

内参:fx,fy,cx,cy,k1,k2,k3,p1,p2
外参:Rt

常用术语
内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points

2 相机模型

内参、外参、畸变系数这些东西是怎么来的?那我们首先要了解一下相机的成像原理和成像过程。相机的成像是一个物理光学现象,从光学基础来讲还是比较复杂的,但是在大多数时候我们只需要关注它最核心的部分,通过构建一些简单的模型来描叙问题的核心,从而近似的还原真实的物理现象。在相机模型中,我们两类最重要的模型就是:成像模型和畸变模型。

1. 成像模型

在成像模型里针孔模型(就是我们通常所说的小孔成像)是最常用的,它简单但有很好的描叙了相机成像的本质。下图为针孔成像示意图:
在这里插入图片描述

在相机中透镜充当了小孔的作用:

在这里插入图片描述
是一个小孔成像的模型,其中:

  1. O点表示camera centre,即相机的中心点,也是相机坐标系的中心点;
  2. z轴表示principal axis,即相机的主轴;
  3. q点所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面;
  4. O1点表示principal point,即主点,主轴与像平面相交的点;
  5. O点到O1点的距离,也就是右边图中的f,即相机的焦距;
  6. 像平面上的x和y坐标轴是与相机坐标系上的X和Y坐标轴互相平行的;
  7. 相机坐标系是以X,Y,Z(大写)三个轴组成的且原点在O点,度量值为米(m);
  8. 像平面坐标系是以x,y(小写)两个轴组成的且原点在O1点,度量值为米(m);
  9. 像素坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(pixel);

在相机的成像平面上放置的是光敏传感器,这些传感器会将成像平面上连续的图像进行采样,这样最终得到的是离散化的图像。在这里就会涉及到相机的内参:成像平面两个方向上传感器单位尺寸的像素密度、成像的中心位置和焦距,这5个参数(像素密度和中心坐标都有两个方向的值)就是我们标定中要确定的主要的内参。

内参一般在相机生产后就比较固定,相对而言外参则是不固定的,因为外参表示的是相机自身在三维空间中相对于给定的世界坐标的位姿,这个位姿信息包括6个参数:三个位置参数、三个姿态参数,实际上两者就是一种线性映射关系。

2. 畸变模型

实际相机用透镜的聚光特性使得投影在成像平面上的光强度更大,成像质量会更好,但是也是由于凸镜的存在也会对图像产生不好的影响,如图像的畸变。

畸变类型和原因,主要有以下两点:

  • 透镜自身的形状对光线传播的影响——导致径向畸变
  • 在机械组装的过程中,透镜和成像平面不平行——导致切向畸变

在径向畸变可分为两类,如下图所示,左边为枕形畸变、右边为桶形畸变:

在这里插入图片描述

可以看到径向畸变只于图像到中心的距离有关,距中心越远畸变越大。对于径向畸变我们使用与中心距离r,相关的高次多项式模型来拟合,其中 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2

x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_distorted = x(1+k_1 r^2+k_2 r^4+k_3 r^6) xdistorted=x(1+k1r2+k2r4+k3r6)
y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y_distorted = y(1+k_1 r^2+k_2 r^4+k_3 r^6) ydistorted=y(1+k1r2+k2r4+k3r6)

切向畸变如下示意图:

在这里插入图片描述

我们新增参数p1、p2建立如下方程来拟合:

x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) x_distorted = x+2p_1 xy+p_2 (r^2+2x^2) xdistorted=x+2p1xy+p2(r2+2x2)
y d i s t o r t e d = y + 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) y_distorted = y+2p_2 xy+p_1 (r^2+2y^2) ydistorted=y+2p2xy+p1(r2+2y2)

统一两种畸变:

x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) x_distorted = x(1+k_1 r^2+k_2 r^4+k_3 r^6)+2p_1 xy+p_2 (r^2+2x^2) xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)
y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) y_distorted = y(1+k_1 r^2+k_2 r^4+k_3 r^6)+2p_2 xy+p_1 (r^2+2y^2) ydistorted=y(1+k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)

上面统一的畸变公式,并不是将第一种畸变的公式整体代入第二个畸变公式,而是在无畸变图像上再增加两种畸变分量,而每种畸变分量只与无畸变图像相关,所以相互之间不影响,只不过径向畸变分量是乘性的而切向畸变是加性的。

根据畸变模型的公式,我们可以看到畸变系数主要是5个:k1、k2、k3、p1、p2,当然在实际中我们可以灵活选择,如畸变较小的镜头可以去掉高次项。

3. 相机成像总结

总体上,为了用数学描叙相机的成像,即将三维世界的物体转化为数字的图像,我们一般将其分为以下四个步骤(下图源于知乎):

在这里插入图片描述

其中刚体变换需要用到相机的外参,透视投影需要用到针孔模型和相机内参中的焦距参数,畸变校正很显然需要使用两种畸变模型和对应的畸变系数,最后数字化图像则需要使用相机内参中剩余参数。

3 双目定位几何模型

成像模型和畸变模型是对单一镜头成像分析,而对于双目摄像头来说,它在成像的基础上还需要定位,因此需要建立一个能够计算物体位置的几何模型。

双目视觉的是模拟人眼,通过视差来计算物体的距离,从而得到物体的空间坐标信息,其几何模型如下图所示:
在这里插入图片描述
这里d为左右图的横坐标之差,也称视差disparty。根据视差,在f和b已知的情况下,我们可以估计目标点离相机的深度距离。视差与深度距离成反比,视差越大,距离越近。另外由于视差最小为 一个像素,于是双目的深度存在一个理论上的最大值。可以看到,当基线越长时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。

虽然由视差计算深度的公式很简洁, 但视差d本身的计算却比较困难,我们需要确切地知道左眼图像某个像素出现在右眼图像的哪一个位置(即对应关系)。此外如果想计算每个像素的深度,其计算量与精度都将成为问题,并且只有在图像纹理变化丰富的地方才能计算视差。

从上图可以看到,双目立体视觉的原理很简单,通过同一物体在两个图片中的视差和两个镜头光轴间的距离(基线),利用相似三角形就可以简单求出物体的距离。但是我们也要看到,此计算的基础是:两个摄像机的成像平面在同一平面上,当然为了计算简单,我们还希望两个相机的中心能水平对齐,这样我们计算视差只需要用到两个图像单个坐标方向上值

但是在实中是不存在完全共面的两个镜头的,所以在双目相机的标定中,我们除了确定单个相机的内外参数、对图像的畸变进行校正外,还需要对进行立体校正,立体校正的目的就是将实际中非共面对准的两个图像,校正到共面对准,注意这是对图像做的,因为相机镜头已经固定了。

在这里插入图片描述
可以看到,为了将两个图像调整到同一平面且中心水平对齐(外极线校准),我们需要知道两个摄像头的相对位置关系,具体来讲就是:旋转矩阵R和平移矩阵T,然后对应将图像做旋转和平移即可。获取立体校正的参数就是立体标定要做的工作,实际上只是对每个镜头进行前面单目标定,用单目标定的参数计算得到立体校正的参数。

以标定物体上的点为参考,可以分别得到左右相机的参考坐标系的坐标表达式,综合两者可以得到从左相机坐标系到右相机坐标系的转关关系,(推导下式其实是很简单的,但是网上的一些资料很少写清楚下面这个公式,有些写出来了也是不对的):

R = R r R l − 1 R = R_r R_l^{-1} R=RrRl1
T = T r − R T l T = T_r - RT_l T=TrRTl

其中,Rr、Tr、Rl、Tl都是通过单目标定得到的参数,这样我们就可以直接求出立体校正的参数。

到此,整个双目视觉需要标定原因、各种标定的原理就讲解完成。

4 标定实践

上面说明了其各种标定参数的作用和原理,现在看看这些参数的实际标定方法。对于双标定,我们要获取的参数是四类:内参、外参、畸变参数、立体校正参数,其中畸变参数的计算需要结合内参和外参共同优化得到,而立体校正参数可以直接由内参和外参直接计算得到,所以虽然是双目相机,但是每一个镜头各自的内参和外参的获取仍然是标定的重点。

4.1内参和外参的数学表示

前面我们分析过相机的内参和外参的物理意义和计算原理,不过当我们计算时,为了保证其数学形式的简洁,通常使用矩阵来表示。从三维世界的坐标点到数字图像中的坐标点,其映射关系用矩阵方法可以表示为:

s 0 m = K [ R , T ] X s_0m=K[R,T]X s0m=K[R,T]X

X是世界坐标系中的点坐标,m是数字图像中点的坐标,使用的是齐次坐标形式,K是相机的内参矩阵,R是相机相对世界坐标系的旋转矩阵、T是平移矩阵, s 0 s_0 s0为缩放因子。

1. 内参矩阵

相机的内参包括:两个方向的像素密度、光轴在成像平面的中心位置、相机的焦距,从上面也可以看到我们在计算中使用的是内参矩阵(Camera Intrinsics):

K = ( f x 0 c x 0 f y c y 0 0 1 ) K = \left(\begin{array}{cc} f_x & 0 & c_x\\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right) K= fx000fy0cxcy1

其中 f x f_x fx为在x方向焦距长度上拥有的像素个数, f y f_y fy为在y方向焦距长度上拥有的像素个数,称为摄像机在x轴和y轴方向上的尺度因子,使用它可以让内参矩阵形式更加简洁。它们可以由针孔模型和图像数字化采样直接推出:

f x = a x f f y = a y f f_x = a_x f \\ f_y = a_y f \\ fx=axffy=ayf

上式中 a x a_x ax a y a_y ay分别表示x方向和y方向上的像素密度,f表示相机的焦距;另外 c x c_x cx为中心在x轴上的像素偏置, c y c_y cy为中心在y轴上的像素偏置。至此内参矩阵就讲所有相机内部参数都包含进去了。

但是在实际中,由于制造工艺的限制,传感器上横向的像素和竖向的像素排列不是绝对的垂直,所以在内参中我们需要加入一个倾斜因子s:

K = ( f x s u 0 0 f y v 0 0 0 1 ) K = \left(\begin{array}{cc} f_x & s & u_0\\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{array}\right) K= fx00sfy0u0v01

不过需要注意的是,由于加入的倾斜因子,内参矩阵中个元素与相机各个参数的对应关系都要将倾斜因子考虑进去。

2. 旋转和平移的齐次表示

R和T是相机的外参,对应相机相对世界坐标系的旋转和平移,这里可以直接用刚体的坐标表换来计算,旋转用旋转矩阵R表示,平移用平移向量T来表示。不过有时候使用齐次矩阵统一旋转矩阵和平移向量能够让计算更简洁方便。

4.2 张正友标定法

1. 简介

相机标定主要有传统标定方法和自标定方法两类:

  • 传统标定方法需要标定参照物,参照物的参数已知,然后分析拍摄到的参照物图像,求得相机参数,传统方法操作相对复杂,但精度较高
  • 自标定方法不依赖于标定参照物,只领用摄像机的运动约束或者环境的约束来进行标定,自标定方法灵活方便,但由于是非线性标定,精度和鲁棒性都不高

张正有平面标定法也称张氏标定法,属于传统的标定方法。张氏标定只要求从不同的角度对同一平面拍摄2幅以上的的图像,就可以求出摄像机的内外参数。由于其平面模板(棋盘格)制作简单且不需要知道平面移动的具体的位置信息,即有穿透方法的高精度的优点、又相比其他传统的标定法要简单灵活,因此在业界得到了广泛使用。

标定所用的棋盘格如下,一般会将其打印出来贴在平面木板上当做标定物:

在这里插入图片描述

2. 单应性映射

由于我们的标定物是棋盘平面,所以棋盘平面的成像实际上是单应性映射(Homography)。那什么是单应性映射?单应性变换是同一物体在不同平面的投影,那么一个投影平面到另一个投影平面的映射关系就是单应性映射。由于单应性映射是在普通的线性变换的基础上增加了额外的约束条件,所以单应性映射会更简单:由于两个被物体都是平面,所以我们可以把变换前后的两个坐标系都建立在平面之上,那么前后两个平面的坐标都可以只用两个坐标值表示。两个平面的单应性映射关系用单应性矩阵来描叙,在张正友标定法中我们直接求得的是单应性矩阵。

在这里插入图片描述

单应性映射矩阵方程为:

( u v 1 ) = H ( x y 1 ) \left(\begin{array}{cc} u \\ v \\ 1 \end{array}\right) = H\left(\begin{array}{cc} x\\ y \\ 1 \end{array}\right) uv1 =H xy1

可以看到,前后连个平面的点都只用了两个坐标值的齐次坐标表示,其中H为3x3单应性矩阵,9个元素值全部未知;不过由于是齐次方程,通常将H提取一个比例系数,让其最后一个元素值为1,只需求得8个未知数即可。每一个点对对应一个矩阵方程,一个矩阵方程对应三个方程组,但是由于是齐次方程,需要去除一个比例系数,实际上一个单应性矩阵方程只能提供两个有效的方程组,因此为了求解H,所以至少需要四个对应点。

2. 从单应性矩阵计算相机内参与外参

结合本文最开始的单个相机的成像坐标转换公式,使用单应性变换,则单应性矩阵为:

H = [ h 1 h 2 h 3 ] = λ K [ r 1 r 2 t ] H=[h1 h2 h3]=λK[r1 r2 t] H=[h1h2h3]=λK[r1r2t]

其中K仍然是内参,λ为比例系数,r1、r2、t为外参矩阵的一部分,计算将H拆解为(h1, h2, h3)的向量,取与r1和r2相关的方程,然后结合r1和r2的两个约束条件:

  1. r1和r2位正交
  2. r1和r2都为单位向量(模为1)

可以得到如下两个消除了r1和r2,用来计算内参K的方程组:

h 1 T K − T K − 1 h 2 = 0 h 1 T K − T K − 1 h 1 = h 2 T K − T K − 1 h 2 h_1^T K^{-T} K^{-1} h_2 = 0 \\ h_1^T K^{-T} K^{-1} h_1 = h_2^T K^{-T} K^{-1} h_2 h1TKTK1h2=0h1TKTK1h1=h2TKTK1h2

内参矩阵K有5个未知量(加入了倾斜因子),每一个单应性矩阵只能得到两个上面的方程组,所以至少需要3个不同的单应性矩阵,即相机需要拍摄棋盘格三种不同的姿态。

得到了内参矩阵后,外参可以直接通过以下公式推出(由之前的推导得到):

λ = 1 ∥ A − 1 h 1 ∥ = 1 ∥ A − 1 h 2 ∥ r 1 = 1 λ K − 1 h 1 r 2 = 1 λ K − 1 h 2 r 3 = r 1 × r 2 t = λ K − 1 h 3 \lambda =\frac{1}{\|A^{-1}h_1\|}=\frac{1}{\|A^{-1}h_2\|} \\ r_1=\frac{1}{\lambda}K^{-1}h_1 \\ r_2=\frac{1}{\lambda}K^{-1}h_2 \\ r_3 = r_1 \times r_2 \\ t=\lambda K^{-1}h_3 λ=A1h11=A1h21r1=λ1K1h1r2=λ1K1h2r3=r1×r2t=λK1h3

3. 径向畸变估计

张氏标定只关注了影响大的径向畸变,根据径向畸变模型,我们有联系畸变后的联系畸变后的坐标和畸变前坐标的方程。一般为避免解非线性方程组,我们使用多个图像多个角点,使用最小二乘法,以畸变前后的坐标差异最小化为目标,迭代优化。

4. 用最大似然估计优化参数

在上面推导的是理想的结果,在实际成像中会受到噪声的干扰,我们认为噪声服从高斯分布,所以在张氏标定中我们用高斯分布来拟合,然后用最大似然法估计内外参数的最优结果。

具体做法是:

  1. 求出理想的内参值
  2. 拍摄多幅棋盘图像,用理想的内参求出不同姿态图像的外参
  3. 用理想的内参和外参预测每个图像中的每个角点的成像坐标,用实际拍摄得到的坐标作为真值,可以得到每一个预测值在高斯分布下的可能的概率。
  4. 使用极大似然法,将所有的预测概率相乘得到似然函数
  5. 以理想内参为初值,迭代优化,让似然函数取得最大值

中间的数学推导我就不写了,简化后最终优化的函数如下:

∑ i = 1 n ∑ j = 1 m ∥ m ^ ( K , R i , t i , M i j ) − m i j ∥ 2 \sum^n_{i=1}\sum^m_{j=1} \| \hat{m}(K,R_i,t_i,M_{ij})-m_{ij} \|^2 i=1nj=1mm^(K,Ri,ti,Mij)mij2

上式需要让其取最小值,优化算法一般用Levenberg-Marquardt算法(一种介于牛顿法与梯度下降法之间的一种非线性优化方法)迭代求解。

4.3 总结

总结整个张氏标定过程包括如下步骤:

  1. 打印一张棋盘格,把它贴在一个平面上,作为标定物
  2. 通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片
  3. 从照片中提取棋盘格角点
  4. 估算理想无畸变的情况下,五个内参和六个外参
  5. 应用最小二乘法估算实际存在径向畸变下的畸变系数
  6. 极大似然法,优化估计,提升估计精度

第1步:准备一张棋盘格,粘贴于墙面,并用直尺测量黑白方格的真实物理长度。

第2步:调用双目摄像头,分别从不同角度拍摄得到一系列棋盘格图像。

第3步:利用左目图片数据集,进行左目相机标定,得到左目内参矩阵K1、左目畸变系数向量D1。

第4步:利用右目图片数据集,进行右目相机标定,得到右目内参矩阵K2、右目畸变系数向量D2。

第5步:将左右目测量得到的参数K1、K2、D1、D2作为输入,再同时利用左右目一一对应好的棋盘格图片,调用stereoCalibrate函数,输出左右目的旋转矩阵R、平移向量T。

第6步:基于测量得到的K1、K2、D1、D2、R、T,进行双目视觉的图像校正。

备注:需要用直尺测量黑白方格的真实物理长度,因为我们会将真实世界的棋盘格3D坐标,以相同的尺度(米为单位),存储于object_points容器中,这样求解得到的平移向量T才会有意义,它的尺度才会和真实世界尺度相对应。然后我们会借助OpenCV棋盘格检测函数,将每张图片对应的棋盘格坐标索引,对应存储于left_img_points、 right_img_points容器中。在得到一系列对应好的2D、3D坐标点后,就可通过线性方程求解参数估计。

标定结构的判断标准

Re-projection error(重投影误差)

其他补充

圆环和棋盘格优缺点
张法没有限制棋盘格或圆环
能解决圆环偏心误差就用圆
拍摄相机和数量选择

经验:
特征点检测的基础是直线圆特征的检测,而特征检测直接和梯度挂钩
特征的理想成像边缘是阶跃的边缘(0-255),但是在实际成像中是不可能达到这样的效果的,在前景与背景中间会有一段过渡带。我们引入锐度的概念来表示特征边缘的锐利程度,他和边缘的亮度值相关。锐度值可以反映出图像的成像质量。

参考

  1. A Flexible New Technique for Camera Calibration
  2. 相机的那些事儿 (三)参数标定
  3. 双目视觉的立体标定方法
  4. 摄像机模型与标定(4)——单应矩阵
  5. 张正友标定算法原理详解

相关文章:

双目视觉标定——1原理与实践

0 前言 双目视觉定位是目前机器(机器人)等领域中使用得非常广泛的视觉定位技术,双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算,所以双目相机装配要求…...

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…...

微服务架构设计的初次尝试——基于以太坊智能合约 + NestJS 微服务的游戏社区与任务市场系统:架构设计

TMDOG微服务架构设计的初次尝试——基于以太坊智能合约 NestJS 微服务的游戏社区与任务市场系统:架构设计 一、开发背景及目的 随着区块链技术的蓬勃发展以及去中心化概念的兴起,越来越多的开发者开始探索如何将区块链应用到实际业务场景中&#xff0…...

“北斗+实景三维”,助力全域社会治理

在国家治理体系和治理能力现代化的大背景下,全域社会治理成为提升国家治理效能的关键。“北斗实景三维”技术组合,为全域社会治理提供了新的技术支撑和解决方案。本文将探讨这一技术如何助力全域社会治理,以及其在实际应用中的潜力和挑战。 …...

#渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

如何使用java雪花算法在分布式环境中生成唯一ID?

引言 在现代分布式系统中,生成唯一标识符(ID)是一个常见的需求。传统的自增ID在分布式环境中会导致冲突,因此需要一种能够在分布式系统中生成全局唯一ID的算法。 雪花算法(Snowflake)就是为了解决这个问题而提出的一种高效的ID生成算法。本文将详细介绍雪花算法的原理、…...

【php常用公共函数】php获取指定时间段相差几小时,几分钟,几秒

实现代码 <?php function diffTime($datetime1, $datetime2) {// 确保 $datetime1 总是小于或等于 $datetime2if (strtotime($datetime1) > strtotime($datetime2)) {$tmp $datetime2;$datetime2 $datetime1;$datetime1 $tmp;}// 转换为时间戳$timestamp1 strtotim…...

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…...

Uniswap/v2-core使用及其交易流程

Uniswap是一个开源的去中心化的交易所&#xff0c;在github上面有以下重要仓库&#xff1a; uniswap-v2-core&#xff1a; 币对池pair的核心智能合约。这个repository包含了Uniswap的币对池pair的所有核心逻辑&#xff0c;增加流动性、减少流动性等。uniswap-v2-periphery&…...

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章&#xff0c;因为多节点配置还是比较麻烦的先要jdk、zookeeper&#xff0c;再ck&#xff0c;还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇&#xff08;三&#xff09;&#x…...

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级&#xff0c;模型文件大约为 767KB。模型下载链接&#xff1a;https://github.com/opencv/…...

Java 实现 RESTful 风格的 Web 服务详解

前言 RESTful&#xff08;Representational State Transfer&#xff09;风格的 API 已经成为现代 Web 服务的标准。它通过简单的 HTTP 方法和资源定位来提供了一种高度可扩展和易于维护的服务接口。Java 作为一种功能强大且广泛使用的编程语言&#xff0c;提供了多种框架来实现…...

18.网工入门篇--------今天介绍下广域网技术

广域网&#xff08;Wide Area Network&#xff0c;WAN&#xff09;是一种能连接多个城市、国家甚至横跨几个洲&#xff0c;提供远距离通信的网络。以下是关于广域网技术的详细介绍&#xff1a; 广域网的组成&#xff1a; 结点交换机&#xff1a;这是广域网的核心设备&#xff0…...

鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元

目录 前言 HarmonyOS NEXT&#xff1a;下一代操作系统的愿景 1、核心特性和优势 2、如何推动应用生态的发展 3、对开发者和用户的影响 华为云服务在鸿蒙原生应用开发中的作用 1、华为云ECS C系列实例 &#xff08;1&#xff09;全维度性能升级 &#xff08;2&#xff…...

Spring JdbcTemplate详解

文章目录 Spring JdbcTemplate详解一、引言二、配置JdbcTemplate1、引入依赖2、配置数据库连接池3、配置JdbcTemplate 三、使用JdbcTemplate操作数据库1、添加数据2、查询数据查询某个值根据条件查询返回某个对象查询对象集合 四、总结 Spring JdbcTemplate详解 一、引言 在J…...

Docker篇(Docker安装)

目录 一、Centos7.x 1. yum 包更新到最新 2. 安装需要的软件包 3. 设置 yum 源为阿里云 4. 安装docker 5. 安装后查看docker版本 6. 设置ustc镜像源 二、CentOS安装Docker 前言 1. 卸载&#xff08;可选&#xff09; 2. 安装docker 3. 启动docker 4. 配置镜像加速 …...

Pytorch 实现图片分类

CNN 网络适用于图片识别&#xff0c;卷积神经网络主要用于图片的处理识别。卷积神经网络&#xff0c;包括一下几部分&#xff0c;输入层、卷积层、池化层、全链接层和输出层。 使用 CIFAR-10 进行训练&#xff0c; CIFAR-10 中图片尺寸为 32 * 32。卷积层通过卷积核移动进行计…...

得物App获评新奖项,正品保障夯实供应链创新水平

近日&#xff0c;得物App再度获评新奖项——“2024上海市供应链创新与应用优秀案例”。 本次奖项为上海市供应链领域最高奖项&#xff0c;旨在评选出在供应链创新成效上处于领先地位、拥有成功模式和经验的企业。今年以来&#xff0c;得物App已接连获得“上海市质量金奖”、“科…...

【数据结构-邻项消除】力扣735. 小行星碰撞

给定一个整数数组 asteroids&#xff0c;表示在同一行的小行星。 对于数组中的每一个元素&#xff0c;其绝对值表示小行星的大小&#xff0c;正负表示小行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗小行星以相同的速度移动。 找…...

002-Kotlin界面开发之Kotlin旋风之旅

Kotlin旋风之旅 Compose Desktop中哪些Kotlin知识是必须的&#xff1f; 在学习Compose Desktop中&#xff0c;以下Kotlin知识是必须的&#xff1a; 基础语法&#xff1a;包括变量声明、数据类型、条件语句、循环等。面向对象编程&#xff1a;类与对象、继承、接口、抽象类等。…...

VMware Workstation Pro for Personal Use (For Windows)

这是从broadcom.com网下载的个人版本的Vmware 17.6.1&#xff0c;存分享不要分。 VMware-workstation-full-17.6.1-24319023.exe(447.93 MB) Build Number: 24319023 Oct 08, 2024 07.33AM SHA2&#xff1a; f95429e395a583eb5ba91f09b040e2f8c53a5e7aa37c4c6bfcaf82115a8…...

论文 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES

1. 背景信息 在信息检索领域&#xff0c;传统的方法往往依赖于大量的标注数据来训练模型&#xff0c;以便在各种任务中表现良好。然而&#xff0c;许多实际应用中的监督数据是有限的&#xff0c;尤其是在不同的检索任务中。最近的研究开始关注如何从一个拥有丰富监督数据的任务…...

使用 Github 进行项目管理

GitHub 是一个广泛使用的代码托管和协作平台&#xff0c;它提供了强大的工具来支持项目管理和团队协作。在项目开发和工作中&#xff0c;避免不了 Github 的使用&#xff0c;然鹅我一直没有稍微系统地学习过 github 的整个工作流程&#xff0c;对这些操作都是一知半解的&#x…...

企业SRC挖掘选择与信息收集指南

内容预览 ≧∀≦ゞ 企业SRC挖掘选择与信息收集指南导语1. 企业SRC的选择2. 信息收集2.1 集团与子公司2.2 小程序与APP2.3 Web端信息收集 3. 信息收集常用模板总结 企业SRC挖掘选择与信息收集指南 导语 近年来&#xff0c;企业的安全响应中心&#xff08;SRC&#xff09;已逐渐…...

Golang | Leetcode Golang题解之第524题通过删除字母匹配到字典里最长单词

题目&#xff1a; 题解&#xff1a; func findLongestWord(s string, dictionary []string) (ans string) {m : len(s)f : make([][26]int, m1)for i : range f[m] {f[m][i] m}for i : m - 1; i > 0; i-- {f[i] f[i1]f[i][s[i]-a] i}outer:for _, t : range dictionary …...

【DBeaver】连接带kerberos的hive[Apache|HDP]

目录 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 1.2 环境配置 二、基于Cloudera驱动创建连接 三、基于Hive原生驱动创建连接 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 在Kerberos官网下载,地址如下&#xff1a;https://web.mit.edu/kerberos…...

Unity3D 开发教程:从入门到精通

Unity3D 开发教程&#xff1a;从入门到精通 Unity3D 是一款强大的跨平台游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧&#xff0c;帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…...

文件操作和 IO(一):文件基础知识 文件系统操作 => File类

目录 1. 什么是文件 1.1 概念 1.2 硬盘, 内存, 寄存器之间的区别 1.3 机械硬盘和固态硬盘 2. 文件路径 2.1 绝对路径 2.2 相对路径 3. 文件分类 4. File 类 4.1 属性 4.2 构造方法 4.3 方法 1. 什么是文件 1.1 概念 狭义上的文件: 保存在硬盘上的文件广义的上的文…...

用Pyhon写一款简单的益智类小游戏——2048

文字版——代码及讲解 代码—— import random# 初始化游戏棋盘 def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4 def add_new_tile(board):empty_cells [(i, j) for i in range(4) for j in range(4) if board[i][j] 0]if empty_cells:i,…...

akshare股票涨跌幅自定义范围查询:A股、港股、美股

参看&#xff1a;https://stock.hexun.com/2024-10-31/215251914.html 涨幅计算公式&#xff1a;&#xff08;当前价格 - 上一个交易日收盘价&#xff09; 上一个交易日收盘价 100% 。 跌幅计算公式&#xff1a;&#xff08;上一个交易日收盘价 - 当前价格&#xff09; 上一个…...