Opencv2.4.9源码分析——Stitching(三)

本文深入探讨了OpenCV2.4.9中的相机参数评估,包括相机定标原理、几何模型、内外参数计算、相对旋转矩阵的获取。通过对图像拼接过程中的相机参数优化,利用光束平差法和最大生成树算法,实现精准的图像拼接。同时,文章详细介绍了波形校正方法,以消除拼接图像的波形效应。
摘要由CSDN通过智能技术生成

3、相机参数评估

3.1 原理

相机参数的评估也称为相机定标。要想理解这部分内容,首先应该从成像原理开始讲起。


图6 小孔成像原理

从图6可以看出,真实物体通过小孔映射到成像平面上,小孔到成像平面的距离称为焦距f。在成像平面上的图像是镜像倒立的,所以为了研究方便,在小孔和物体之间定义一个虚拟成像平面(在后面,我们把该平面也称为成像平面),它与小孔的距离也为焦距,则两个成像平面的图像大小是相同的,但虚拟成像平面上的图像与原物体的方向是一样的。


图7 成像的几何模型

我们以小孔为坐标原点建立一个三维直角坐标系XYZ(如图7所示),坐标原点C称为相机的光心。成像平面xy平行于XY,并且距离光心Cf,其中Z轴定义为光轴,它与成像平面xy的交点为P,因此CPf。设空间中的任一点Q的坐标为(X, Y, Z),该点映射到成像平面的点q的坐标为(x, y,f)。

由几何知识可得:

(31)

式中,λZ/f,则xfX/ZyfY/Z。因此空间中Q点的三维坐标映射到成像平面的二维坐标q点在齐次坐标下的线性映射关系为:

(32)

如图7所示,在成像平面(坐标系为xy)的坐标原点为P,但图像(设坐标系为uv)的坐标原点一般在左上角,所以这两个坐标系之间需要通过平移来进行转换。另外成像平面xy是长度单位,而相机图像传感器的单位是像素,因此像素与长度之间也是需要转换的,而且水平和垂直的像素往往是不相同的,所以横纵轴的转换系数是不一致。因此式32改写为:

(33)

式中,fufv为焦距f在横纵轴的长度和像素的转换,它们之间的关系可以写为fvαfu,(cx, cy)为坐标平移。因为矩阵K的参数都是基于相机内部自身的参数,因此K称为相机内参数,KTV

相机除了具有内参数外,还有外参数。式33中的(X, Y, Z)称为相机坐标,而它与真实的世界坐标(X’, Y’, Z’)还存在欧几里得变换,即:

(34)

式中,R为3×3的旋转矩阵,t为3×1的平移向量。式34代入式33,得

(35)

式中,[R|t]称为相机外参数,M称为投影矩阵。

如果得到的两幅图像如图3所示的那样,即相机在三角架上通过旋转得到的两幅图像,则对于同一个世界坐标上的点(X’, Y’, Z’),在两幅图像上的坐标点分别为(u0, v0)和(u1, v1),即:

(36)

由于相机只做旋转处理(或者我们认为物体离相机很远),则t0t1=0,从而得到(u0, v0)和(u1, v1)的关系为:

(37)

式中,R10为由图像1到图像0的相对旋转矩阵,R10R1R0-1。由式2可得

(38)

为简单起见,我们设两幅图像的相机内参数中的坐标平移都为0,即KV,因为抛弃参数T对图像拼接影响不大。

我们在评估焦距时,还需定义f1uf1vf1f0uf0vf0,即设图像的长宽等像素:

(39)

则式38表示为

(40)

式中,R10=[rij]。

由式40我们就可以得到焦距f0f1:观察矩阵R10可知,R10前两行一定有相同的范数,并且是正交的,因此

(41)

(42)

由式41可得:

(43)

由式42可得:

(44)

由式43和式44得到了两个f0,选取哪个呢?比较式43和式44中分母部分的绝对值的大小,如果式43的分母大,则选择分式大的值作为f0,否则如果式44的分母大,则选择值小的作为f0

同理,矩阵R10的前两列也一定有相同的范数,并且也是正交的,因此

(45)

(46)

由式45可得

(47)

由式46可得

(48)

比较式47和式48中分母部分的绝对值的大小,如果式48的分母大,则选择分式大的值作为f1,否则如果式47的分母大,则选择值小的作为f1

如果两幅图像的焦距相同,则最终这两幅图像的焦距f为:

(49)

当评估计算得到多个f时,可取这些f的中值作为所有相机的焦距。

焦距得到后,我们就可以由式38得到R10

(50)

R01(由图像0到图像1的相对旋转矩阵)为:

(51)

(52)

对于刚性物体,它的旋转都是沿笛卡尔坐标系的x轴、y轴和z轴旋转,则分别沿着这三个轴的旋转矩阵定义为:

(53)

则旋转矩阵R表示为:

(54)

三维旋转除了可以用旋转矩阵描述外,还可以用旋转向量r描述,即r=[rx, ry, rz]T。旋转向量的长度(模)表示绕轴逆时针旋转的角度θ。旋转向量和旋转矩阵可以通过Rodrigues算法进行转换。由旋转向量转换为旋转矩阵的Rodrigues算法描述如下:

(55)

(56)

(57)

式中,I为3×3的单位矩阵。而由旋转矩阵转换为旋转向量的Rodrigues算法公式为:

(58)

当有多幅图像需要拼接为一幅图像时,是要以其中一幅图像为基准,其他图像都要旋转到该基准图像平面上的,所以就需要找到基准平面。这里用到的算法为最大生成树算法。

待拼接图像的排列是无序的,而且我们事先是不知道它们之间的关系的,我们只知道它们之间的单应矩阵,而单应矩阵是由图像间的内点计算评估得到的。由此我们可以构造一个无向图G,G的节点为图像,G的边为内点数,然后利用并查集在该G中得到一棵最大生成树。


图8 最大生成树

图8为用于拼接的最大生成树的一个例子,图(a)为无向图,节点为图像(A、B、C、D、E),节点间的边为内点数。图(b)为最大生成树,由图像C到图像B要经过最大的边连接,所以要经过图像A,而图像C和图像B之间的连接就需要去掉了。

我们把树的中心节点作为基准图像。中心节点的确定方法为:计算每一个节点到所有叶节点的距离,把其中的最大值作为该节点的值;然后选择这些值中最小者作为中心节点。这里的距离指的是节点间的节点数。如图8(c)所示,节点A和C为中心节点。中心节点可能是1个,也可能是2个,如果是2个,则选择其中一个即可。

基于以上方法,我们得到了相机的内外参数,但这样得到的参数忽略了多个图像间的约束,而且会产生累计误差。这时,我们就需要用到光束平差法(Bundle Adjustment)来精确化相机参数。光束指的是相机光心“发射”出来的光束(或射线),它透过相片达到物点,因此相片中的点应该和物点处于一个光束线上,但当两者不共线时,我们就需要对结构和视角参数进行调节,以达到最优解甚至共线的目的。最优化一般采用前文介绍过的LM算法。

应用于光束平差法的LM算法,误差指标函数可以有两个,一个是重映射误差,另一个是射线发散误差。

重映射误差公式为式25(即一个内点要有x轴和y轴两个误差值),而单应矩阵H是由式38得到。也就是说H是由相机的内外参数得到。相机的内外参数一共有7个:fuαcxcyrxryrz。前4个参数是内参数(见式33),后3个参数是外参数(即式55中的旋转向量的三个元素)。因此式25中的hh(fu, α, cx, cy, rx, ry,rz),由此得到J(h)为:

(59)

式中,n表示待拼接的图像数量,也就是所有的相机。有时为了计算方便,导数可以用差分近似,例如我们要计算efu的偏导,则

(60)

式中,∆表示一个很小的数。


图9 射线发散概念

第二种误差指标函数是基于射线发散原理。如图9所示,不同的相机发出的射线透过相片后达到同一个物点,但由于误差,两条射线不会相交,或者称为两条射线发散了,我们就把这两条射线间的最短距离d定义为射线发散误差。

下面,我们不加证明的给出射线发散误差的计算公式:

设(u1, v1, 1)和(u2, v2, 1)为两幅不同图像的同一特征点的齐次坐标,则由单应矩阵H1H2分别得到它们的物点坐标为:

(61)

分别对坐标进行归一化处理:

(62)

(63)

为了简化计算,射线间的最短距离可以表示为基于不同焦距f1f2下的归一化后的物点坐标之差:

(64)

式64说明在计算射线发散误差时,每一个内点有x轴、y轴和z轴三个误差值。

我们假设射线就是相机的光轴,因此单应矩阵H中的参数α=1,cxcy=0,所以式25中h只是基于4个参数的变量,即h(fu, rx,ry, rz),由此得到射线发散误差的J(h)为:

(65)

前面介绍的光束平差法会引起波形效应,即拼接的图像会呈现蛇形分布,这是因为真实拍摄相片时不大可能都保持水平而不倾斜的,也就是重力轴没有垂直于图像。因此我们就需要引入一个全局校正矩阵Q,用于“拉直”拼接图像,该方法也成为波形校正。

校正的目的应该是,在第k个相机旋转矩阵Rk乘以Q后,全局y轴应该与图像的x轴垂直,这种约束条件可以表示为:

(66)

式中,i=(1, 0, 0),j=(0, 1, 0),该式的含义是Rk的第一行rk0垂直于Q的第二列q1。式66的这类约束问题可以看成是最小二乘问题:

(67)

因此,q1是矩量矩阵∑rT

opencv是一个开源的计算机视觉库,opencv2.4.9是其中的一个版本。在opencv2.4.9中,有一个模块叫做stitching,用于图像拼接。 图像拼接是将多张图像按照一定的顺序和方式进行合并,形成一张更大视野覆盖范围的图像。拼接的过程需要解决图像间的重叠区域匹配、图像变换与叠加等问题。 在opencv2.4.9stitching模块中,主要有以下几个重要的类: 1. Stitcher类:拼接器类,用于执行拼接的主要操作。它提供了一系列的方法,如设置拼接的模式、添加要拼接的图像等。 2. FeaturesFinder类:特征点检测类,用于在图像中寻找特征点。该类利用SIFT、SURF等算法来检测图像中的关键点,以便进行匹配。 3. FeaturesMatcher类:特征点匹配类,用于对图像中的特征点进行匹配。该类使用KNN算法进行特征点的匹配,并利用RANSAC算法进一步筛选特征点,剔除误匹配。 4. Estimator类:变换估计类,用于估计图像间的变换参数。该类可以通过特征点的对应关系,计算图像间的旋转矩阵、平移矩阵等变换参数。 5. Blender类:图像融合类,用于将拼接后的图像进行融合。该类可以进行多种融合方式,如线性融合、多频融合等。 通过以上的类和方法,opencv2.4.9stitching模块能够完成图像拼接的过程。整个过程包括特征点检测、特征点匹配、变换参数估计和图像融合等步骤。 需要指出的是,本文只是对opencv2.4.9stitching模块进行了初步的介绍,具体的源码分析需要深入研究。整个源码工程庞大,包含很多细节和算法,需要对计算机视觉和图像处理有较深入的理解才能进行分析和改进。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值