基于RobHess源码的sift全景图像合成过程分析

在我改进的RobHess源码中,拼接的顺序大致如下: 1.读取图片,使用opencv的undistort函数来对摄像机拍摄的图片进行畸变矫正。 2.为每幅图想调用sift_features函数,检测特征点。 3.用第i幅图的特征点建立kd树,用第i+1幅图的特征点在建立好的kd树进行搜索,初步筛选出第一批特征点。 4.在之前筛选出的特征点的基础上,用RANSAC算法进行二次筛选,并计算得出每幅图片的转移矩阵。 5.从转移矩阵中获取水平方向和垂直方向的位移,进行图像拼接。

下面分条说明几个重要步骤的过程:

sift特征点监测

sift算法具有尺度、旋转和平移的不变性,也就是说如果我们对一幅图片进行缩放、旋转或者平移等的变换,然后调用sift算法对它进行检测,在变换前后的图片中,sift能检测出相同的特征点。 在具体算法中,高斯差分金字塔(DOG)可以使得算法具有尺度不变性和平移不变性,通过求关键点的梯度和方向直方图,可以使得算法具有旋转不变性。 最后,sift会把求出来的特征点以及特征点附近的点的信息用一个高维向量来表示。 参考页面

kd树

假设数据是三维的,那么kd树就是按照某种建树的规则,把空间划分成不同的区域,,把数据存储在这些区域中。

Created with Raphal 2.1.2开始选取方差最大的维度得到这个维度上的中值以这个中值节点为界划分空间还有其他节点吗?结束yesno

例子 6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}构建kd树的具体步骤为:

确定:split域=x。具体是:6个数据点在x,y维度上的数据方差分别为39,28.63,所以在x轴上方差更大,故split域值为x; 确定:Node-data = (7,2)。具体是:根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以Node-data域位数据点(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:split=x轴的直线x=7; 确定:左子空间和右子空间。具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};

kd树的查找比较复杂,因为两个很近的点可能很早就被不同维度给切开来了,所以需要回溯,这里不展开了。 在过程3中,我们用第i+1幅图的特征点在第i幅图建立的kd树中进行检索,找到第i幅图中距离最近的两个特征点,如果这两个特征点的比值小于我们设定的阈值,则认为距离最近的特征点就是第i+1幅图中特征点对应的点(初步筛选)。 参考页面

RANSAC算法

RANSAC算法的中文翻译叫做随机抽样一致性算法,引用网络上对这个算法的解释: RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。 RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:

1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。5.最后,通过估计局内点与模型的错误率来评估模型。

这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

在过程4中,我们先在过程3筛选的特征点中随机选取4个匹配点对(8个点),计算变换矩阵H;然后对第i幅图的所有特征点用H去进行变换,再去检查变换结果中符合误差范围的点个个数是否大于阈值(其实就是用随机选取的匹配点的变换矩阵与第i幅图相乘,如果变换之后的图的大部分特征点的位置与第i+1幅图的特征点的位置相差不大,则认为检验通过了);如果大于阈值,则成功,如果小于阈值,则重复这个循环。

Created with Raphal 2.1.2开始随机选取4对点计算变换矩阵H用H对匹配图的特征点进行变换计算变换完的特征点与待匹配图的特征点的匹配度这个匹配度大于阈值吗?结束yesno

变换矩阵

全比例系数为1,4对点,8个方程,正好解出8个未知数。 这里我们我需要l和m。

累死累活不说,走马观花反而少了真实体验,

基于RobHess源码的sift全景图像合成过程分析

相关文章:

你感兴趣的文章:

标签云: