当前位置 : 首页

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源码分析: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源码分析: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中暂停线程的执行

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

OpenCV2.4.4中利用直方图均衡化增强图像对比度(Mat结构实现)

直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin(直方图中的柱子)中。bin中的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。无论如何,直方图获得的是数据分布的统计图。
灰度图像的直方图的性质:

  • 1、直方图是一幅图像中各像素灰度出现频次的统计结果,它只反映图像中不同灰度值出现的次数,而没反映某一灰度所在的位置。也就是说,它只包含了该图像的某一灰度像素出现的概率,而丢失了其所在的位置信息。
  • 2、任一幅图像,都有惟一确定一幅与它对应的直方图,但不同的图像可能有相同的直方图。即图像与直方图之间是多对一的映射关系。
  • 3、由于直方图是对具有相同灰度值的像素统计得到的,因此,一幅图像各子区的直方图之和就等于该图像全图的直方图。

岛田庄司《占星术杀人魔法》读后感

  昨天晚上夜谈的时候,聊到了少年包青天里的一个分尸案,今天查了查,叫《隐逸村案》,里面有用6个人的尸体拼出7个人的假象,马上就想到了《占星术杀人案》。
  其实用这个想法的小说还真不少,包青天里的应该是借鉴了金田一中的《异人馆村杀人事件》,而金田一是借鉴了岛田的占星术,还有庄秦的《夜长梦多》也是借鉴了岛田的占星术,这些小说里面都有拼凑尸体的诡计,但其中做的最完美的还属占星术了。