《sift程序详解》PPT课件

上传人:tia****nde 文档编号:113795653 上传时间:2019-11-09 格式:PPT 页数:28 大小:6.85MB
返回 下载 相关 举报
《sift程序详解》PPT课件_第1页
第1页 / 共28页
《sift程序详解》PPT课件_第2页
第2页 / 共28页
《sift程序详解》PPT课件_第3页
第3页 / 共28页
《sift程序详解》PPT课件_第4页
第4页 / 共28页
《sift程序详解》PPT课件_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《《sift程序详解》PPT课件》由会员分享,可在线阅读,更多相关《《sift程序详解》PPT课件(28页珍藏版)》请在金锄头文库上搜索。

1、SIFT特征提取过程中 的核心函数,PART ONE.物理架构 opencv_contrib-3.1.0(版本号)/modules/xfeature2d/opencv_xfeature2d project /src/sift.cpp,cv namespace,xfeature2d namespace,Feature2D,父类/基类,SIFT类,feature2d的子类,父类/基类,SIFT_Impl类,SIFT的子类,PART TWO.运行架构,主函数 int main() /创建SIFT_Impl类指针 Ptr f2d = xfeatures2d:SIFT:create(); Mat img

2、_1 = imread(“1.jpg“);/读入图片 vector keypoints_1; /用于存放检测到的关键点的容器 f2d-detect(img_1, keypoints_1);/检测出关键点 Mat descriptors_1; f2d-compute(img_1, keypoints_1, descriptors_1); /计算描述子 waitKey(0); /等待任意按键按下 ,Feature2D:detect(InputArray image, CV_OUT std:vector& keypoints, InputArray mask=noArray(),SIFT_Impl:

3、detectAndCompute(image, mask, keypoints, noArray(), false);,SIFT_Impl:detectAndCompute(image, noArray(), keypoints, descriptors, true);,Feature2D:compute( InputArray image, std:vector& keypoints, OutputArray descriptors ),调用了 检测关键点函数,调用了 计算描述子函数,createInitialImage() 图像初始化函数,buildGaussianPyramid()构建高

4、斯金字塔函数,buildDoGPyramid()构建DOG金字塔函数,SIFT_Impl:detectAndCompute(image, mask, keypoints, noArray(), false);,findScaleSpaceExtrema()检测尺度空间极值函数,adjustLocalExtrema()调整极值函数,calcOrientationHist()计算关键点主方向函数,函数功能:检测图片中的关键点 参数image:输入图片 参数mask:无掩模 参数keypoints:关键点容器 参数noArray():无描述子 参数false:不使用给定的关键点,PART TREE

5、.检测关键点部分,图像尺度空间的构建 1.1图像初始化函数 函数功能:将输入图像转化为灰度图,并设置图像初始尺度 c+:static Mat createInitialImage( const Mat& img, bool double ImageSize, float sigma ) 入口参数: 参数const Mat& img:输入图像 参数bool double ImageSize:是否将初始图像扩大两倍,若值为1,则图像扩大为原来两倍 参数float sigma:设定图像的初始尺度 返回值:无 说明:一个图像的尺度空间L(x,y, ),定义为原始图像I(x,y)与一个可变尺度的2维高斯

6、函数G(x,y, )卷积产生:,其中:,lowe 把初始图像的尺度I(x,y) 设置为0.5即:I(x,y) = I(x,y,0.5),那么由L(x,y, 1)得到L(x,y, 2),即由尺度为1的图像生成尺度为2的图像的公式为:,图像尺度空间的构建 1.2构建图像金字塔函数: 函数功能:将输入图像作为金字塔初始图像,通过不断进行高斯模糊和降采样后的 图片存放在Mat类容器中 c+:void SIFT_Impl:buildGaussianPyramid( const Mat& base, std:vector& pyr, int nOctaves ) const 入口参数: 参数const M

7、at& base:输入图像 参数std:vector& pyr:用于存储金字塔图像的容器 参数int nOctaves:金字塔的组数 返回值:无,图像尺度空间的构建 1.3构建图像DOG金字塔函数: 函数功能:将构建好的高斯金字塔相邻层相减后构成DOG金字塔存放在Mat类容器中 void SIFT_Impl:buildDoGPyramid( const std:vector& gpyr, std:vector& dogpyr ) const 入口参数: 参数:vector& gpyr:存放高斯金字塔图片的容器 参数:vector& dogpyr: 存放DOG金字塔图片的容器 返回值:无,关键点

8、定位 关键点定位并确定主方向函数 函数功能:(1)在DOG空间检测极值点 (2)精确定位关键点位置和尺度并进行插值处理 (3)去除边缘不稳定的点 (4)为关键点分配主方向 void SIFT_Impl:findScaleSpaceExtrema( const std:vector& gauss_pyr, const std:vector& dog_pyr,std:vector& keypoints ) const 入口参数: 参数const std:vector& gauss_pyr:高斯金字塔容器 参数const std:vector& dog_pyr:DOG金字塔容器 参数std:vect

9、or& keypoints:存放关键点容器 返回值:无,调整局部极值函数 函数功能:精确定位关键点位置和尺度并进行插值处理,去除边缘不稳定的点 static bool adjustLocalExtrema( const std:vector& dog_pyr, KeyPoint& kpt, int octv,int& layer, int& r, int& c, int nOctaveLayers, float contrastThreshold, float edgeThreshold, float sigma ) 入口参数: 参数const std:vector& dog_pyr:DOG尺

10、度空间金字塔 参数KeyPoint& kpt:定义了一个KeyPoint类对象用来存放筛选通过的关键点 参数int octv:该像素点所在的组数 参数int& layer:该像素点所在的层数 参数int& r:该像素点所在的行 参数int& c:该像素点所在的列 参数int nOctaveLayers:金字塔每组的层数S 参数float contrastThreshold:对比度阈值0.04 参数float edgeThreshold:边缘响应阈值 参数float sigma:此处的sigma为初始尺度sigma0 返回值:若极值调整成功返回1,调整失败返回0,说明:,其中令 得:,令 解得

11、:,接下来判断偏移量在每个维度的偏差是否大于0.5,若不大于直接保留,若大于进行迭代插值处理。在设置的迭代次数内修正成功则保留,否则舍弃。,设f(i,j)是y轴为i、x轴为j的图像像素值,则在 (i,j)点处的一阶、二阶及二阶混合偏导为:,再对 进行筛选去除对比度低的点,在opencv中,使用下面的公式来判断其是否为不稳定的极值:,去除边缘响应较强的点,具体在程序中的计算同上:,计算关键点主方向函数 函数功能:为特征点分配主方向 static float calcOrientationHist( const Mat& img, Point pt, int radius, float sigma

12、, float* hist, int n ) 入口参数: 参数const Mat& img:当前特征点所在的图像 参数Point pt:关键点位置 参数int radius:指统计在以关键点为中心,以radius=3*1.5sigma为半径的区域为作为该关键点的邻域,以统计直方图的形式来确定主方向 参数float sigma:这里的sigma是指相对于当前组第一层图像的尺度来说的 参数float* hist:定义了hist指针用于存放直方图 参数int n:直方图的条数 返回值:直方图的主峰值,说明:直方图平滑处理;opencv使用的平滑公式为:,由于直方图代表的只是一个角度范围,想要得到更精

13、确的方向角度值,需要对离散的梯度方向直方图进行插值拟合处理,拟合公式为:,SIFT_Impl:detectAndCompute (image, noArray(), keypoints, descriptors, true),函数功能:计算图片中的关键点描述子 参数image:输入图片 参数noArray():无掩模 参数keypoints:关键点容器 参数descriptors:描述子 参数true:使用给定的关键点,unpackOctave(),calcDescriptors() 计算关键点描述子函数,calcSIFTDescriptor,PART FOUR.关键点描述子,createIn

14、itialImage() 图像初始化函数,buildGaussianPyramid()构建高斯金字塔函数,buildDoGPyramid()构建DOG金字塔函数,unpackOctave(const KeyPoint& kpt, int& octave, int& layer, float& scale),计算sift特征描述子,入口参数: 参数const KeyPoint& kpt:关键点 参数int& octave:关键点所在层 参数int& layer:关键点所在组 参数float& scale:关键点所在尺度的比例因子 返回值:无,函数功能:去除关键点所在高斯金字塔的层数,组数,以及尺

15、度比例因子 以方便后面计算描述子,计算sift特征描述子 3.2计算sift特征描述子 函数功能:计算特征点描述符 calcDescriptors函数 static void calcDescriptors(const std:vector& gpyr, const std:vector& keypoints, Mat& descriptors, int nOctaveLayers, int firstOctave ) 入口参数: 参数const std:vector& gpyr:存放高斯金字塔图片的容器 参数const std:vector& keypoints:存放关键点的容器 参数Mat

16、& descriptors:描述子矩阵 参数int nOctaveLayers:高斯金字塔层数 参数int firstOctave:如果原图像扩大两倍,则为-1,如果没有,则为0 返回值:无,说明:计算sift特征描述子要用高斯金字塔,dog金字塔只用来求取极值点 int d=SIFT_DESCR_WIDTH=4,n=SIFT_DESCR_HIST_BINS=8 float size=kpt.size*scale 计算特征点的特征矢量calcSIFTDescriptor(img, ptf, angle, size*0.5f, d, n, descriptors.ptr(int)i),函数功能:计算sift特征描述子 static void calcSIFTDescriptor( const Mat& img, Point2f ptf, float o

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号