sift全景图拼接完整的项目(六)

         如果你能看到这里,说明已经立志学习拼接算法了。在前面的文章中介绍一些原理,苦于没有一个完整的项目。这里就为大家提供一个GitHub的开源项目。该项目是在linux编写,用了很多C++11/14的特性,实测vs2015通过。如果在配置过程中有问题就评论我。


按照惯例,以下完全是参考:http://blog.csdn.net/hc1025808587/article/details/52922308#comments



本文全文翻译自http://ppwwyyxx.com/2016/How-to-Write-a-Panorama-Stitcher/。这是一个关于作者如何编写OpenPano算法的一个总结,OpenPano是一个开源的全景拼接软件。相关代码在github上。

SIFT Feature


Lowe 的SIFT[1]算法实现放在feature/目录下。这个算法的流程和一些结果在这一章里做简单的介绍。

Scale Space & DOG Space


首先,一个尺度空间(Scale Space)由 S×O 个灰度尺度图组成。最初的图片被调整成 O 种不同大小(即层级,octaves),每一层加上 S 个不同的 σ 高斯模糊。由于不同大小尺寸的图片上检测特征点,这些特征点将具备尺度不变性。

高斯模糊通过两个一维卷积实现,而不是一个二维卷积。这将显著地加速该计算过程。

在每个层级(octave),计算每两个相邻的高斯模糊后图片的差值,可以构建一个差分高斯空间(DOG)。DOG空间由 (S1)×O 个灰度图组成。

DOG

Extrema Detection


在DOG空间中,通过比较相邻的三个方向26个像素来检测所有的极大或极小值: x,y,σ
extremaextrema_lenna
然后使用抛物线插补(parabolic interpolation)去搜索极值精确的 (x,y,σ) 。为了去得到更多有区别的特征点,低对比度(设定DOG图像中的阈值像素值)和边缘的点(设定主曲率阈值)不被接受。结果如下:
feature_point

Orientation Assignment


首先,在尺度空间计算每个点的梯度和方向。在之前的流程中检测到的每个关键点,根据他们的梯度幅度值作为权重,将它的相邻点的方向将累积起来并建立一个方向直方图,权重由它们的梯度的幅度决定,

Descriptor Representation


Lowe建议[1]选择关键点附近的16点来为每个店建立一个方向直方图并且合成为一个SIFT特征。每个直方图使用8个从0到360度的不同的格子。一次结果特征是一个128位浮点向量。因为每个关键点的主方向是已知的,利用相对于主方向的相对方向,这个特征是旋转不变的。

利用论文[2]的建议,利用一个简单修改的SIFT——RootSIFT,鲁棒性更强。

Feauture Matching


这个128维描述子的欧氏距离是两幅图之间特征匹配的距离标尺。如果一个点和他最近邻和次近邻的点之间的距离是相似的会被认定是不可信的而被拒绝。一次匹配的结果如下:
match

特征匹配被认为是最耗时的一步。所以我使用FLANN library去特征向量中查询两个最临近特征。Intel SSE intrinsics被用来加速去计算两个特征向量的欧氏距离。

Transformation Estimation


Estimate from Match


众所周知,对于任意两幅相机在固定点拍摄的图片,匹配对的齐次坐标都能够由一个单应变换矩阵联系起来,因此对于一对对应的点 p=(x,y,1),q=(u,v,1) ,我们能够得到

pHq=K1R1RT2K12q

单应矩阵是一个不考虑尺度影响的 3×3 矩阵。它有下面的两种可能的方程:
HomographyI:H=a11a21a31a12a22a32a13a231

HomographyII:H=a11a21a31a12a22a32a13a23a33 with constraint||H||=1

当拍摄两幅图片时,相机仅存在平行于成像平面的旋转和平移变换时(没有视角申缩),那么它们能够通过一个仿射变换矩阵联系起来:
A=a11a210a12a220a13a231

给定一组匹配点,以上的任何一个方程都能够通过直接线性变换(Direct Linear Transform)估计出来。这些估计方法的实现放在 lib/imgproc.cc中。具体参照 [3]

然而这些方法对于噪声的鲁棒性并不强。实际上,由于错误匹配对的存在,RANSAC(Random Sample Consensus)算法[4]经常被用来在变矩阵的求解中剔除噪声。在RANSAC的每一步迭代中,几组匹配点对被随机地选择用来生成一个最佳的变换矩阵,并且和该矩阵一致的点对被看做是内点。在一定量的迭代后,拥有最多内点对的变换被看做最后的结果。该算法实现放在stitch/transform_estimate.cc中。

Match Validation


在每次矩阵估计后,我对每个矩阵进行了优劣检查(health check),以避免因为错误的匹配对而产生畸变的变换估计。这个过程包括两种检查:(具体参见stitch/homography.hh中)

  • 单应变换 (H3,1,H3,2) 中的尺度参数不能太大。他们的绝对值应不能超过0.002。
  • 跳动不能够出现在图像拼接过程中。如果xy坐标发生了跳动那么这个单应变换是不能够被接受的。

再无限制地拼接中,有必要判断两幅图是否匹配。上面流程中估计得到的大量内点能够作为一个评判尺度。然而,对于高分辨率图片,即使执行了足够多次的RANSAC迭代,也有可能实际上得到了一个有着大量内点的错误匹配。为了解决这个问题,考虑到错误匹配在空间上通常是更加随机分布的,通过设置匹配之间的几何限制条件能够帮助找出错误匹配对出来。因此,在RANSAC完成后会返回一组内点,按照论文[5]中的建议,可以通过一些重叠检测来进一步验证匹配情况。

特别的,知道了一个候选的变换矩阵,通过计算变换对应角点的凸包,我能够找出两幅图之间的重叠区域。在重叠区域被找到后就可以应用两个滤波器了。

  • 两幅图的重叠区域不能够区别太大。
  • 在重叠区域内,应该有足够大比例的匹配点对是内点。我使用了内点率来描述该匹配的置信度。

由于错误的匹配可能是随机和无规律的,这种方法

  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值