/*
Functions for detecting SIFT image features.
For more information, refer to:
Lowe, D. Distinctive image features from scale-invariant keypoints.
<EM>International Journal of Computer Vision, 60</EM>, 2 (2004),
pp.91--110.
Copyright (C) 2006-2010 Rob Hess <hess@eecs.oregonstate.edu>
Note: The SIFT algorithm is patented in the United States and cannot be
used in commercial products without a license from the University of
British Columbia. For more information, refer to the file LICENSE.ubc
that accompanied this distribution.
@version 1.1.2-20100521
*/
/*
此文件最重要
包含SIFT特征点检测的实现
*/
#include "sift.h"
#include "imgfeatures.h"
#include "utils.h"
#include "opencv\cxcore.h"
#include "opencv\cv.h"
/************************ 未暴露接口的一些本地函数的声明 **************************/
/************************* Local Function Prototypes *************************/
//将原图转换为32位灰度图并归一化,然后进行一次高斯平滑,并根据参数img_dbl决定是否将图像尺寸放大为原图的2倍
static IplImage* create_init_img( IplImage*, int, double );
//将输入图像转换为32位灰度图,并进行归一化
static IplImage* convert_to_gray32( IplImage* );
//根据输入参数建立高斯金字塔
static IplImage*** build_gauss_pyr( IplImage*, int, int, double );
//对输入图像做下采样生成其四分之一大小的图像(每个维度上减半),使用最近邻差值方法
static IplImage* downsample( IplImage* );
//通过对高斯金字塔中每相邻两层图像相减来建立高斯差分金字塔
static IplImage*** build_dog_pyr( IplImage***, int, int );
//在尺度空间中检测极值点,通过插值精确定位,去除低对比度的点,去除边缘点,返回检测到的特征点序列
static CvSeq* scale_space_extrema( IplImage***, int, int, double, int, CvMemStorage*);
//通过在尺度空间中将一个像素点的值与其周围3*3*3邻域内的点比较来决定此点是否极值点(极大值或极小都行)
static int is_extremum( IplImage***, int, int, int, int );
//通过亚像素级插值进行极值点精确定位(修正极值点坐标),并去除低对比度的极值点,将修正后的特征点组成feature结构返回
static struct feature* interp_extremum( IplImage***, int, int, int, int, int, double);
//进行一次极值点差值,计算x,y,σ方向(层方向)上的子像素偏移量(增量)
static void interp_step( IplImage***, int, int, int, int, double*, double*, double* );
//在DoG金字塔中计算某点的x方向、y方向以及尺度方向上的偏导数
static CvMat* deriv_3D( IplImage***, int, int, int, int );
//在DoG金字塔中计算某点的3*3海森矩阵
static CvMat* hessian_3D( IplImage***, int, int, int, int );
//计算被插值点的对比度:D + 0.5 * dD^T * X
static double interp_contr( IplImage***, int, int, int, int, double, double, double );
//为一个feature结构分配空间并初始化
static struct feature* new_feature( void );
//去除边缘响应,即通过计算主曲率比值判断某点是否边缘点
static int is_too_edge_like( IplImage*, int, int, int );
//计算特征点序列中每个特征点的尺度
static void calc_feature_scales( CvSeq*, double, int );
//将特征点序列中每个特征点的坐标减半(当设置了将图像放大为原图的2倍时,特征点检测完之后调用)
static void adjust_for_img_dbl( CvSeq* );
//计算每个特征点的梯度直方图,找出其主方向,若一个特征点有不止一个主方向,将其分为两个特征点
static void calc_feature_oris( CvSeq*, IplImage*** );
//计算指定像素点的梯度方向直方图,返回存放直方图的数组
static double* ori_hist( IplImage*, int, int, int, int, double );
//计算指定点的梯度的幅值magnitude和方向orientation
static int calc_grad_mag_ori( IplImage*, int, int, double*, double* );
//对梯度方向直方图进行高斯平滑,弥补因没有仿射不变性而产生的特征点不稳定的问题
static void smooth_ori_hist( double*, int );
//查找梯度直方图中主方向的梯度幅值,即查找直方图中最大bin的值
static double dominant_ori( double*, int );
//若当前特征点的直方图中某个bin的值大于给定的阈值,则新生成一个特征点并添加到特征点序列末尾
static void add_good_ori_features( CvSeq*, double*, int, double, struct feature* );
//对输入的feature结构特征点做深拷贝,返回克隆生成的特征点的指针
static struct feature* clone_feature( struct feature* );
//计算特征点序列中每个特征点的特征描述子向量
static void compute_descriptors( CvSeq*, IplImage***, int, int );
//计算特征点附近区域的方向直方图,此直方图在计算特征描述子中要用到,返回值是一个d*d*n的三维数组
static double*** descr_hist( IplImage*, int, int, double, double, int, int );
static void interp_hist_entry( double***, double, double, double, double, int, int);
//将某特征点的方向直方图转换为特征描述子向量,对特征描述子归一化并将所有元素转化为整型,存入指定特征点中
static void hist_to_descr( double***, int, int, struct feature* );
//归一化特征点的特征描述子,即将特征描述子数组中每个元素除以特征描述子的模
static void normalize_descr( struct feature* );
//比较函数,将特征点按尺度的降序排列,用在序列排序函数CvSeqSort中
static int feature_cmp( void*, void*, void* );
//释放计算特征描述子过程中用到的方向直方图的内存空间
static void release_descr_hist( double****, int );
//释放金字塔图像组的存储空间
static void release_pyr( IplImage****, int, int );
/*********************** Functions prototyped in sift.h **********************/
/*使用默认参数在图像中提取SIFT特征点
参数:
img:图像指针
feat:用来存储特征点的feature数组的指针
此数组的内存将在本函数中被分配,使用完后必须在调用出释放:free(*feat)
返回值:提取的特征点个数,若返回-1表明提取失败
*/
/**
Finds SIFT features in an image using default parameter values. All
detected features are stored in the array pointed to by \a feat.
@param img the image in which to detect features
@param feat a pointer to an array in which to store detected features
@return Returns the number of features stored in \a feat or -1 on failure
@see _sift_features()
*/
int sift_features( IplImage* img, struct feature** feat )
{
//调用_sift_features()函数进行特征点检测
return _sift_features( img, feat, SIFT_INTVLS, SIFT_SIGMA, SIFT_CONTR_THR,
SIFT_CURV_THR, SIFT_IMG_DBL, SIFT_DESCR_WIDTH,
SIFT_DESCR_HIST_BINS );
}
/*使用用户指定的参数在图像中提取SIFT特征点
参数:
img:输入图像
feat:存储特征点的数组的指针
此数组的内存将在本函数中被分配,使用完后必须在调用出释放:free(*feat)
intvls:每组的层数
sigma:初始高斯平滑参数σ
contr_thr:对比度阈值,针对归一化后的图像,用来去除不稳定特征
curv_thr:去除边缘的特征的主曲率阈值
img_dbl:是否将图像放大为之前的两倍
descr_width:特征描述过程中,计算方向直方图时,将特征点附近划分为descr_width*descr_width个区域,每个区域生成一个直方图
descr_hist_bins:特征描述过程中,每个直方图中bin的个数
返回值:提取的特征点个数,若返回-1表明提取失败
*/
/**
Finds SIFT features in an image using user-specified parameter values. All
detected features are stored in the array pointed to by \a feat.
@param img the image in which to detect features
@param feat a pointer to an array in which to store detected features
@param intvls the number of intervals sampled per octave of scale space
@param sigma the amount of Gaussian smoothing applied to each image level
before building the scale space representation for an octave
@param cont_thr a threshold on the value of the scale space function
\f$\left|D(\hat{x})\right|\f$, where \f$\hat{x}\f$ is a vector specifying
feature location and scale, used to reject unstable features; assumes
pixel values in the range [0, 1]
@param curv_thr threshold on a feature's ratio of principle curvatures
used to reject features that are too edge-like
@param img_dbl should be 1 if image doubling prior to scale space
construction is desired or 0 if not
@param descr_width the width, \f$n\f$, of the \f$n \times n\f$ array of
orientation histograms used to compute a feature's descriptor
@param descr_hist_bins the number of orientations in each of the
histograms in the array used to compute a feature's descriptor
@return Returns the number of keypoints stored in \a feat or -1 on failure
@see sift_keypoints()
*/
int _sift_features( IplImage* img, struct feature** feat, int intvls,
double sigma, double contr_thr, int curv_thr,
int img_dbl, int descr_width, int descr_hist_bins )
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于SIFT算法的图像拼接,我这里用vs2010+opencv2.4.10实现了一下,下载后直接可用。如果是其他版本则需配置一下。 这位博客大神的分析的RobHess源码挺不错的:http://blog.csdn.net/masibuaa/article/details/9246493
资源推荐
资源详情
资源评论
收起资源包目录
基于SIFT算法的图像拼接.rar【vs2010+opencv2.4.10工程】 (216个子文件)
sift.c 59KB
xform.c 29KB
kdtree.c 23KB
imgfeatures.c 19KB
utils.c 9KB
minpq.c 5KB
demo.cpp 10KB
基于SIFT算法的图像拼接.exe 109KB
基于SIFT算法的图像拼接.vcxproj.filters 1KB
book2.gif 56KB
book1.gif 31KB
xform.h 10KB
sift.h 8KB
utils.h 7KB
imgfeatures.h 6KB
kdtree.h 4KB
minpq.h 3KB
vc100.idb 587KB
基于SIFT算法的图像拼接.ilk 645KB
G_match_DistRatio.JPG 305KB
G_match_RANSAC.JPG 281KB
church0_match_DistRatio.jpg 280KB
church0_match_RANSAC.jpg 259KB
F_match_DistRatio.JPG 176KB
yard_Mosaic_Proc.jpg 172KB
calc_match_DistRatio.jpg 163KB
church01_Feat.jpg 163KB
yard_match_RANSAC.jpg 161KB
F_match_RANSAC.JPG 160KB
yard_match_DistRatio.jpg 160KB
calc_match_RANSAC.jpg 159KB
G1_Feat.JPG 157KB
church02_Feat.jpg 156KB
horse_match_DistRatio.jpg 153KB
G2_Feat.JPG 151KB
phone_match_DistRatio.jpg 149KB
phone_match_RANSAC.jpg 145KB
calc2_Feat.jpg 139KB
C_match_DistRatio.jpg 129KB
player2_Feat.jpg 125KB
C_match_RANSAC.jpg 124KB
player_match_DistRatio.jpg 124KB
yard1_Feat.jpg 122KB
church02.jpg 122KB
church01.jpg 121KB
F2_Feat.JPG 120KB
phone2_Feat.jpg 119KB
yard2_Feat.jpg 118KB
church0_Mosaic.jpg 117KB
G_Mosaic_Proc.JPG 115KB
yard_Mosaic.jpg 114KB
F1_Feat.JPG 107KB
desk34_match_RANSAC.jpg 105KB
desk34_match_DistRatio.jpg 105KB
desk14_match_DistRatio.JPG 104KB
desk14_match_RANSAC.JPG 104KB
F_Mosaic_Proc.JPG 101KB
B_Mosaic.jpg 99KB
B_Mosaic_Proc.jpg 99KB
horse_match_RANSAC.jpg 99KB
horse1_Feat.jpg 98KB
E_match_RANSAC.jpg 98KB
E_match_DistRatio.jpg 96KB
desk4_Feat.JPG 96KB
desk24_match_DistRatio.jpg 95KB
B_match_DistRatio.jpg 90KB
calc2.jpg 89KB
phone2.jpg 87KB
desk24_match_RANSAC.jpg 87KB
player2.jpg 87KB
A_match_DistRatio.jpg 85KB
B_match_RANSAC.jpg 85KB
G_Mosaic.JPG 84KB
A_match_RANSAC.jpg 84KB
car_match_DistRatio.jpg 83KB
park_match_RANSAC.jpg 82KB
horse2_Feat.jpg 79KB
park_match_DistRatio.jpg 79KB
G1.JPG 77KB
lena_match_RANSAC.jpg 77KB
lena_match_DistRatio.jpg 76KB
F_Mosaic.JPG 76KB
G2.JPG 74KB
car_match_ransac.jpg 73KB
C1_Feat.jpg 71KB
E_Mosaic.jpg 71KB
C_Mosaic_Proc.jpg 70KB
C_Mosaic.jpg 70KB
land_match_DistRatio.jpg 69KB
E_Mosaic_Proc.jpg 69KB
C2_Feat.jpg 68KB
E1_Feat.jpg 68KB
G3.JPG 68KB
car1_Feat.jpg 64KB
G4.JPG 64KB
car2_Feat.jpg 64KB
F3.JPG 63KB
F2.JPG 62KB
park_Mosaic.jpg 62KB
G5.JPG 61KB
共 216 条
- 1
- 2
- 3
hujingshuang
- 粉丝: 1203
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页