• 大小: 59KB
    文件类型: .c
    金币: 2
    下载: 0 次
    发布日期: 2024-01-28
  • 语言: C/C++
  • 标签: SIFT  

资源简介

这是我在一个SIFT群里找到的opencv代码 关于SIFT检测特征点以及生成128维描述子向量的全过程讲解得很详细 基本上每一步都有注释 只要学过C++的 应该都看得懂 比CSDN上有些理论讲解得更清楚 特别是关于编程的细节部分

资源截图

代码片段和文件信息

/*
Functions for detecting SIFT image features.

For more information refer to:

Lowe D.  Distinctive image features from scale-invariant keypoints.
International Journal of Computer Vision 60 2 (2004)
pp.91--110.

Copyright (C) 2006-2010  Rob Hess 

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 
#include 

/************************ 未暴露接口的一些本地函数的声明 **************************/
/************************* 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 );
//若当前特征点的

评论

共有 条评论