一、项目名称:全景图像拼接
二、语言、库和开发环境:C++、opencv249、VS2013
三、参考
1:博客https://blog.csdn.net/zhaocj/article/details/78799194?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2:计算机视觉中的多视图几何
四、包含原理:
1、特征点
2、2D射影变换
3、相机参数评估
4、拼接缝的查找
5、图像融合
4.1 ORB特征点
1、算法介绍
ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。ORB算法比sift算法效率高两个数量级,ORB算法综合性能在各种测评里是最好的。
作者:Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski
时间:2011年
论文:“ORB:An Efficient Alternative to SIFT or SURF”
ORB算法分为两部分,分别是特征点提取和特征点描述。
特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust Independent Elementary Features)特征描述算法改进的。ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。
ORB算法的速度是sift的100倍,是surf的10倍。
1.1 Fast特征提取
ORB算法的特征提取是由FAST算法改进的,这里成为oFAST(FASTKeypoint Orientation)。也就是说,在使用FAST提取出特征点之后,给其定义一个特征点方向,以此来实现特征点的旋转不变形。FAST算法是公认的最快的特征点提取方法。FAST算法提取的特征点非常接近角点类型。oFAST算法如下:
图1 FAST特征点判断示意图
步骤1:建立金字塔,实现特征点的多尺度不变性。
设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(opencv默认为8)。将原图像按比例因子搭建成nlevels幅图像的金字塔。
图像尺度为:scale=1scaleFactornlevel 。
代码
其中,firstlevel为0,level从0到8.
图像的分辨率为 sz*scale+64,sz为图像的原始分辨率
步骤二:Fast特征点检测
步骤三:关键点滤波,去除所有小于图像边缘大小的关键点。
步骤四:计算特征点的响应强度:
步骤五:在金字塔每层挑选出响应值最大的featureNum个特征点
每一层特征点的数目为:
步骤六:计算特征点的方向
ORB算法提出使用矩(moment)法来确定FAST特征点的方向。也就是说通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。矩定义如下:
其中,I(x,y)为图像灰度表达式。该矩的质心为:
假设角点坐标为O,则向量的角度即为该特征点的方向。计算公式如下:
步骤七、特征点描述
1)为了增加特征描述符的抗噪性,算法首先需要对图像进行高斯平滑处理。
2)steered BRIEF(旋转不变性改进)
在使用oFast算法计算出的特征点中包括了特征点的方向角度。假设原始的BRIEF算法在特征点SxS(一般S取31)邻域内选取n对点集。
经过旋转角度θ旋转,得到新的点对,
3)计算二进制串的特征描述符。在一个特征点的邻域内,选择n对像素点pi、qi(i=1,2,…,n)。然后比较每个点对的灰度值的大小。如果I(pi)> I(qi),则生成二进制串中的1,否则为0。所有的点对都进行比较,则生成长度为n的二进制串。一般n取128、256或512,opencv默认为256。
Opencv中固定选取512个点,总共比较32*8=256次,dsize为32,每8次的结果以二进制码形式构成一个字节。