当前位置 : 首页

基于SIFT特征的全景图像拼接


基本步骤

  • 1 读入两张图片并分别提取SIFT特征
  • 2 利用k-d tree和BBF算法进行特征匹配查找
  • 3 利用RANSAC算法筛选匹配点并计算变换矩阵
  • 4 图像融合

SIFT算法以及RANSAC算法都是利用的RobHess的SIFT源码,前三个步骤RobHess的源码中都有自带的示例。

有栖川有栖《马来铁道之谜》读后感

  这篇文章是从日本推理作家协会奖获奖作品中找的,是2003年第56届的两篇获奖作品之一,看之前先查了一下资料,感觉挺有意思的,本身对火车挺感兴趣,而且内容介绍上说向读者挑战超完美密室,引起我很大兴趣。
  故事发生在马来西亚的金马伦高原,看完后也上网查了查,风景确实不错。文中的第一人称叙述者就是作者自己,名字就叫有栖川有栖,身份也是一个推理作家,但案件的侦破不是靠作者,而是和作者一起去旅游的一个犯罪学教授,他们俩的搭档类似福尔摩斯和华生,作者扮演华生的角色,辅助调查并做传记记录。

RobHess的SIFT源码分析:xform.h和xform.c文件

SIFT源码分析系列文章的索引在这里:

这两个文件中实现了RANSAC算法(RANdom SAmple Consensus 随机抽样一致)。
RANSAC算法可用来筛选两个图像间的SIFT特征匹配并计算变换矩阵。

利用RANSAC算法筛选SIFT特征匹配的主要流程是:

  • (1) 从样本集中随机抽选一个RANSAC样本,即4个匹配点对
  • (2) 根据这4个匹配点对计算变换矩阵M
  • (3) 根据样本集,变换矩阵M,和误差度量函数计算满足当前变换矩阵的一致集consensus,并返回一致集中元素个数
  • (4) 根据当前一致集中元素个数判断是否最优(最大)一致集,若是则更新当前最优一致集
  • (5) 更新当前错误概率p,若p仍大于允许的最小错误概率则重复(1)至(4)继续迭代,直到当前错误概率p小于最小错误概率

RobHess的SIFT源码分析:sift.h和sift.c文件

SIFT源码分析系列文章的索引在这里:

这两个文件是RobHess的SIFT库中最重要的两个文件,里面包括用SIFT算法进行特征点检测的函数。
文件中的内容说白了很简单,就是两个特征点检测函数sift_features()_sift_features()
sift_features()是用默认参数进行特征点检测, _sift_features()允许用户输入各种检测参数,其实sift_features()中也是再次调用_sift_features()函数。
所以,你只需提供原图像和存储特征点的数组以及其他一些检测参数,然后调用sift_features()_sift_features()就可完成SIFT特征点检测。
sift.h中有默认的各种特征检测中用到的参数的宏定义,sift.c中是检测函数的实现,是最核心的一个文件,里面的一些未暴露接口的本地函数就有31个之多。

SIFT算法大致分为四个步骤:

  • 步骤一:建立尺度空间,即建立高斯差分(DoG)金字塔dog_pyr
  • 步骤二:在尺度空间中检测极值点,并进行精确定位和筛选
  • 步骤三:特征点方向赋值,完成此步骤后,每个特征点有三个信息:位置、尺度、方向
  • 步骤四:计算特征描述子

RobHess的SIFT源码分析:kdtree.h和kdtree.c文件

SIFT源码分析系列文章的索引在这里:

kdtree.h和kdtree.c这两个文件中实现了k-d树的建立以及用BBF(Best Bin First)算法搜索匹配点的函数。
如果你需要对两个图片中的特征点进行匹配,就要用到这两个文件。
关于k-d树的理解,参考这篇文章,写的挺好:http://blog.csdn.net/ijuliet/article/details/4471311

RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

SIFT源码分析系列文章的索引在这里:

imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特征点绘制函数的声明。
对应的imgfeatures.c文件中是特征点的导入导出以及特征点绘制函数的实现。
特征点的类型有两种:

  • 一种是是牛津大学VGG提供的源码中的特征点格式;
  • 另一种是David.Lowe提供的源码中的特征点格式。

RobHess的SIFT源码分析:综述

最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究。

后来想用OpenCV中自带的SIFT特征检测器进行特征检测和拼接,但还是有隔靴搔痒的感觉,接触不到SIFT算法的本质。
看到网上大多数都是使用RobHess的SIFT源码,自己也下载了一份进行了分析,并用RobHess的SIFT源码实现了特征提取和图像拼接。

利用RANSAC算法筛选SIFT特征匹配


利用RANSAC算法筛选SIFT特征匹配的主要流程

关于RANSAC算法的基本思想,可从网上搜索找到,这里只是RANSAC用于SIFT特征匹配筛选时的一些说明。
RANSAC算法在SIFT特征筛选中的主要流程是:

  • (1) 从样本集中随机抽选一个RANSAC样本,即4个匹配点对
  • (2) 根据这4个匹配点对计算变换矩阵M
  • (3) 根据样本集,变换矩阵M,和误差度量函数计算满足当前变换矩阵的一致集consensus,并返回一致集中元素个数
  • (4) 根据当前一致集中元素个数判断是否最优(最大)一致集,若是则更新当前最优一致集
  • (5) 更新当前错误概率p,若p大于允许的最小错误概率则重复(1)至(4)继续迭代,直到当前错误概率p小于最小错误概率

OpenCV2.4.4图像仿射变换

图像仿射变换简介:

OpenCV中Mat类的图像如何设置ROI

Mat类表示的图像进行ROI操作有两种方法

  • (1)使用拷贝构造函数Mat(constMat& m, const Rect& roi ),矩形roi指定了兴趣区
    例如:

    Mat src = imread(“xx.jpg”);  
    Mat srcROI( src, Rect(0,0,src.cols/2,src.rows/2));  

    srcROI的数据与源图像src共享存储区,所以此后在srcROI上的操作也会作用在源图像src上。

OpenCV2.4.4图像旋转和缩放

旋转变换公式的推导:

OpenCV2.4.4中调用SIFT特征检测器进行图像匹配


OpenCV中一些相关结构说明

特征点类:

class KeyPoint  
{  
       Point2f  pt;  //坐标  
       float  size; //特征点邻域直径  
       float  angle; //特征点的方向,值为[0,360),负值表示不使用  
       float  response; //  
       int  octave; //特征点所在的图像金字塔的组  
       int  class_id; //用于聚类的id  
}

OpenCV2.4.4实现Harris角点检测

代码如下:

OpenCV2.4.4实现Shi-Tomasi角点检测(goodFeaturesToTrack)

代码如下:

Qt中暂停线程的执行

在线程中定义一个信号量: