zoukankan      html  css  js  c++  java
  • SIFT在OpenCV中的调用和具体实现(HELU版)

    前面我们对sift算法的流程进行简要研究,那么在OpenCV中,sift是如何被调用的?又是如何被实现出来的了?

    特别是到了3.0以后,OpenCV对特征点提取这个方面进行了系统重构,那么整个代码结构变成了什么模样?
    在代码中
    可以看出目前的结构是基于hess的算法进行的重构。那么首先需要解决的是整体的调用和实现结构问题,然后是hess算法的结构问题,再然后才是具体的算法。需要做的事情很多,一起来研究。
    一、OpenCV中sift调用接口和例子
        首先是一定要编译使用contrib版本的OpenCV代码,同时最后设置的时候需要注意,头文件和命名空间要选择正确。
         在最新版本的OpenCV中,已经对特征提取这块的函数进行了统一接口:        
        Mat matSrc = imread("e:/template/lena.jpg");
        Mat gray;  
        Mat draw;
        cvtColor( matSrc, gray, CV_RGB2GRAY );  
        Mat descriptors;  
        std::vector<KeyPoint> keypoints;
        // 生产sift结构
        Ptr<SiftFeatureDetector> siftFD = SiftFeatureDetector::create();
        siftFD->detectAndCompute(gray,Mat(),keypoints,draw);
        drawKeypoints(gray,keypoints,gray,Scalar(0,0,255),DrawMatchesFlags::DEFAULT);
    结果:
        这里也只是简单地把特征点给画了出来,并没有将方向等信息进行表示。下面我们具体看一看sift在OpenCV中是如何实现的。
        OpenCV是开发源代码的,所以这里的代码都是可以自己看到的。那么联调的方式为
    二、sift的代码结构解析
    注意,sift的原始地址在
     
    它的类结构为:
    它的构建函数为:
    直接返回的是本类的指针
    我们去看代码,基本了解结构以后,就直接从我们想要用的那个函数开始“顺藤摸瓜”。我们想要的是detectAndCompute  函数。
        
    三、sift的代码具体实现
    step0: createInitialImage 将图片转换成为合适的大小
        Mat base = createInitialImage(imagefirstOctave < 0, (float)sigma);
        最为简单的一步,据说将输入的图片变化为规整的大小和格式:
    //step1: buildGaussianPyramid 构建高斯金字塔
        buildGaussianPyramid(basegpyrnOctaves);
    //step2: buildDoGPyramid 构建高斯差分金字塔
        buildDoGPyramid(gpyrdogpyr);
    //step3: findScaleSpaceExtrema removeDuplicated 寻找并筛选尺度空间特征值
            findScaleSpaceExtrema(gpyrdogpyrkeypoints);
    注意这里将特征值的初略寻找和细化寻找放在了一起(一个循环)
    其中
    其中二
    注意:
     
    //step4: calcDescriptors 计算特征值
            calcDescriptors(gpyrkeypointsdescriptorsnOctaveLayersfirstOctave);
    三、简单小结
           这里也只是将sift的代码挑了出来,简单进行了分析。应该说OpenCV的代码本身才是其最为精髓的地方,无论是代码背后的理论,还是代码实现的技术,以及各种提升速度的方法,都对于我们写出出色的图像处理算法和运用很有帮助。
           而学习的最好方法就是去实现创造。OpenCV本身就是开源的项目,基于现有的这么多的资源,在图像处理广阔的领域去进行创新,不断巩固提升自己的能力。与大家共勉!
  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/7628664.html
Copyright © 2011-2022 走看看