2024年C C++最全Opencv2(3),阿里珍藏版C C++框架体系架构手写文档

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

首先我们需要利用已知数据构建K-D树(这里的数据指的是图像B中的所有特征点,而特征点是用描述符表示的)。要想构建K-D树,需要解决两个问题:第一是选择哪个维度进行分割;第二是如何把数据分割为左分支和右分支。对于第一个问题,通常的做法是交替循环的依次选择所有的维度,例如在3-D树中,“父节点”用的x维,则“子节点”用y维,“孙节点”用z维,“重孙节点”又回到x维,“重重孙节点”用y维,以此类推。对于第二问题,一般的做法是选择该维度的中值进行分割,小于该值的数据归为左分支,大于该值的数据归为右分支。以上方法可以保证K-D树是平衡的,即每个叶节点与根节点的距离基本相同。

当K-D树构建好了以后,我们就可以搜索待查询数据(这里指的是图像A中的特征点a)的最近邻数据,它的过程是:从根节点出发,依据分叉规则(即选择分割维度和比较中值),沿着搜索路径达到最佳叶节点;然后再从该叶节点出发,回溯搜索路径,找到是否有比最佳叶节点更好的节点,用以替代它。从概念上来说,回溯的过程就是以待查询点为中心,以待查询点到最佳叶节点的距离为半径,画一个超球体,如果该超球体与分割维度所在的超平面相交,则需要搜索该超平面的另一侧(即另一个分支),如果不相交,则无需再搜索另一侧。

特征点的匹配点对得到后,我们就可以利用这些匹配点对评估计算图像间的单应矩阵H

如果平面到平面之间的映射关系是投影映射的话,那么一定存在一个非奇异的3×3的矩阵H,当p表示一个平面的任意一点时,那么该点映射到另一平面的点就为Hp。当相机围绕一点进行旋转而得到不同的两幅图像时(如图3所示),这两幅图像之间就是投影映射,它们之间的关系就可以用矩阵H来进行描述,即图像A中的点通过矩阵H就可以映射到图像B中,从而实现两幅图像的拼接。

图3 通过旋转相机,得到不同的图像

需要指出的是,当矩阵H乘以任意一个不为零的常数时,并不改变两个平面之间的投影映射关系,因此H被认为是只有8个自由度的单应矩阵。

设图像A中的某一点的齐次坐标p为(u, v,1),该点在图像B中的匹配点的齐次坐标**p’**为(u’, v’,1),则:

(2)

(3)

图像坐标(x, y)所对应的齐次坐标为(x, y, 1),而齐次坐标(x, y, z)所对应的图像坐标为(x/z, y/z)。

我们把式3展开,则:

(4)

把式4写成矩阵的形式:

(5)

我们观察式5等号左侧的第一个矩阵会发现,第三行是前两行的线性组合,即

(6)

因此式5应改为

(7)

一对匹配点对可以列写两个方程,那么要想求解只有8个自由度的矩阵H只需要四个匹配点对即可,但要求这四对点每三个都不能共线:

(8)

式中,h是矩阵H的向量形式。Ah=0被称为齐次线性最小二乘问题,因此求解单应矩阵H就转换为齐次线性最小二乘问题。该方法也称为直接线性变换(DLT)。

式8表示的是一个齐次线性方程组,式中A为矩阵,h为相量,我们需要求非零的h。而h属于A的零空间,有时也称为A的零(右)相量,因此h可以由A的奇异值分解(SVD)得到,也就是说并不需要解方程组就可以得到hA的奇异值分解形式为:

(9)

h为V的最后一列,再把h重新整理,就可得到H

通过式9得到h的方法非常依赖于图像的坐标原点及尺度,这会使算法不稳定,产生数值误差。但我们可以通过归一化的方法使数值收敛于正确的结果。归一化的方法是首先平移图像坐标,使图像的坐标原点为匹配点对的重心;然后是改变尺度,使匹配点到平移后的坐标原点的距离为1。匹配点对所在的两幅图像,以及它们的横、纵坐标都必须分别独立的进行上述归一化处理。归一化的具体计算过程为:

(10)

式中,n表示匹配点对,这里n为4,该式得到了坐标平均值,即坐标平移量。

(11)

式11得到了坐标尺度,即匹配点到原点的距离为1,如果想使距离为 (许多文献上,此处的值都是 ,Opencv用的是1),则只需再乘以 即可。由式10和式11分别构成两个坐标变换矩阵:

(12)

则两幅图像的坐标分别变为:

(13)

(14)

这时,我们就需要用坐标变换后的4个匹配点对计算单应矩阵,得到 ,它与真实坐标下的H的关系为:

(15)

式中的T’-1很容易由式12中的T’得到:

(16)

下面我们给出归一化直接线性变换的步骤:

●由式10和式11分别计算平移量和尺度;

●由式12计算坐标变换矩阵;

●由式13计算坐标变换后的特征点坐标值,并代入式8得到,再经过奇异值分解(式9)得到

●由式15得到最终的单应矩阵H

以上是由4个匹配点对计算出单应矩阵H,为了增加鲁棒性,可以用更多的匹配点对计算H。此时式8就是一个超定方程组,因为A是2n×9的矩阵,而n>4,所以2n>9。当匹配点对n的数量很大时,直接用SVD的方法就不是很方便,这时我们就可以直接应用最小二乘法求解。因为Ah=0,它的误差平方函数f(h)可以写为:

(17)

很显然,我们应该使f(h)最小,此时的h即为求解。因此我们对f(h)求导,并使导数为0,则

(18)

ATA是对称的9×9的方阵,我们对ATA进行特征值分解,则h应该是ATA的特征值为0所对应的特征向量,当然因为存在误差,有时会出现没有一个特征值为0的情况,这时h等于最接近0的特征值所对应的特征向量。可以很容易的证明,对A进行奇异值分解与对ATA进行特征值分解得到的h是完全相等。因此特征值分解的方法也适用于n=4的情况。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化的资料的朋友,可以添加戳这里获取*

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值