全景图像拼接——ORB特征点

一、项目名称:全景图像拼接

二、语言、库和开发环境:C++、opencv249、VS2013

三、参考

1:博客https://blog.youkuaiyun.com/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算法如下:

https://i-blog.csdnimg.cn/blog_migrate/69e0944425d656664351a5cb162cb3f1.png

 

图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为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。矩定义如下:

    https://i-blog.csdnimg.cn/blog_migrate/c9d7f65642b8bb65c9aae0f0df36fabc.png

其中,I(x,y)为图像灰度表达式。该矩的质心为:

https://i-blog.csdnimg.cn/blog_migrate/8179d486bd7a5896ae9ef5d5a7fd0e8e.png

假设角点坐标为O,则向量的角度即为该特征点的方向。计算公式如下:

https://i-blog.csdnimg.cn/blog_migrate/44918f06bc0d62f790ee05348f906a30.png

步骤七、特征点描述

1)为了增加特征描述符的抗噪性,算法首先需要对图像进行高斯平滑处理。

2)steered BRIEF(旋转不变性改进)

在使用oFast算法计算出的特征点中包括了特征点的方向角度。假设原始的BRIEF算法在特征点SxS(一般S取31)邻域内选取n对点集。

https://i-blog.csdnimg.cn/blog_migrate/3fd0417c836b49a32d41876a41015e67.png

经过旋转角度θ旋转,得到新的点对,

https://i-blog.csdnimg.cn/blog_migrate/4acf3e9567a3118c13f085933457214d.png

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次的结果以二进制码形式构成一个字节。

### 使用暴力匹配算法实现全景图像拼接 #### 方法概述 暴力匹配算法通过直接比较两个图像中所有可能的像素块之间的相似度来进行匹配。这种方法虽然计算量大,但在某些情况下能够提供较为可靠的匹配结果。为了提高效率和准确性,在实际应用中通常会先提取局部特征描述子,然后再进行暴力匹配。 对于全景图像拼接而言,使用暴力匹配的具体流程如下: 1. **读取输入图片** 2. **检测关键点并计算描述符**:可以采用SIFT、SURF或其他合适的特征检测器。 3. **建立索引结构用于加速查找过程**(可选) 4. **执行暴力匹配操作**:遍历每一对来自不同图像的关键点组合,评估它们之间距离或相似程度; 5. **筛选有效配对关系**:去除错误匹配项,保留最有可能属于同一位置的不同视图间对应点集; 6. **估算变换模型参数**:利用RANSAC等鲁棒估计技术求解两幅或多幅照片间的几何映射关系——通常是单应矩阵(Homography Matrix); 7. **融合多张影像数据**:根据上述获得的关系式调整各帧画面的位置,并最终合成一张完整的广角场景图[^1]。 下面给出一段基于MATLAB环境下的简单示例代码展示如何运用暴力匹配完成两张连续拍摄的照片缝合工作: ```matlab % 加载待处理图像文件 imgA = imread('image1.jpg'); imgB = imread('image2.jpg'); % 转换为灰度模式便于后续分析 grayImgA = rgb2gray(imgA); grayImgB = rgb2gray(imgB); % 提取ORB特征点及其对应的描述向量 detectorType = 'FAST'; descriptorExtractorType = 'ORB'; pointsA = detectMINCorners(grayImgA, detectorType); % 自定义函数detectMINCorners()模拟FAST角点探测功能 [featuresA, pointsA] = extractFeatures(grayImgA, pointsA, descriptorExtractorType); pointsB = detectMINCorners(grayImgB, detectorType); [featuresB, pointsB] = extractFeatures(grayImgB, pointsB, descriptorExtractorType); % 创建BFMatcher对象准备做一对一粗暴比对任务 matcher = cv.BFMatcher(); matches = matcher.match(featuresA, featuresB); % 绘制初步找到的一些潜在关联点位作为可视化辅助工具 figure; showMatchedFeatures(imgA, imgB, matchedPointsA, matchedPointsB); % 应用随机抽样一致性(RANSAC)算法剔除异常值影响从而精炼出更精确的结果 [homoMatrix, status] = estimateGeometricTransform(matchedPointsA.Location, ... matchedPointsB.Location,'homography'); inlierIdx = find(status==1); matchedInliersA = matchedPointsA(inlierIdx,:); matchedInliersB = matchedPointsB(inlierIdx,:); % 展示经过过滤后的高质量连接线段图形表示形式 figure; showMatchedFeatures(imgA,imgB,matchedInliersA,matchedInliersB,... 'ShowKeyPoints',false,'MatchesStyle','lines'); % 执行透视投影转换操作使第二张相片按照所推导出来的仿射变化规律贴合至首张之上构成无缝衔接效果 outputSize = size(imgA)+size(imgB)-min(size(imgA),[],'all'); %#ok<MINUS> panoramaImage = imwarp(imgB,homoMatrix,'OutputView',... imref2d(outputSize(1:2))); % 将原始的第一张照片叠加到已经过变形校正之后的新画布上形成最终产物 resultPanorama = insertObjectIntoBackground(imgA, panoramaImage); imshow(resultPanorama); title('Final Panoramic Image Result Using Brute Force Matching Algorithm') ``` 请注意以上程序片段仅作为一个概念性的指导框架而存在;具体细节可能会因版本差异和个人需求有所变动。此外,这里假设读者具备一定基础编程能力以及熟悉相关领域术语含义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值