特征点检测:FAST and SIFT

特征点检测和匹配是计算机视觉中一个很有用的技术。在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用。本文记录一些常用的特征点检测算法,例如FAST/SIFT

一 FAST特征点检测

  • 算法简述

FAST(features from accelerated segment test)。很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST特征点检测是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。

FAST特征检测算法来源于corner的定义,这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点


  • 算法实现(C语言)
    #include 
    #include 
    #include 
    
    #include 
    
    using namespace cv;
    
    int main()
    {
            Mat image;
            image = imread("flower.jpg");
            // vector of keyPoints
            std::vector keyPoints;
            // construction of the fast feature detector object
            //FastFeatureDetector fast(40); 
            // feature point detection
            //fast.detect(image,keyPoints);
            Ptr fast=FastFeatureDetector::create(40);
        fast->detect(image, keyPoints);
            drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);
            imshow("FAST feature", image);
            cvWaitKey(0);
        return 0;
    }
    
    CmakeLists.txt:
     cmake_minimum_required(VERSION 2.8)
     project( DisplayImage )
     find_package( OpenCV REQUIRED )
     add_executable( DisplayImage DisplayImage.cpp )
     target_link_libraries( DisplayImage ${OpenCV_LIBS} )
    

    二 FAST特征点检测

  • 算法简述


    利用原始图像与高斯核的卷积来建立尺度空间,并在高斯差分空间金字塔上提取出尺度不变性的特征点。该算法具有一定的仿射不变性,视角不变性,旋转不变性和光照不变性,所以在图像特征提高方面得到了最广泛的应用


  • 算法实现(C语言)
    由于OpenCV3.0将SIFT包含在了扩展部分中,所以官网上下载的版本是没有SIFT的,为此需要到https://github.com/itseez/opencv_contrib/下载扩展包opencv_contrib,并按照里面的说明重新编译OpenCV
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
        //Create SIFT class pointer
        Ptr f2d = xfeatures2d::SIFT::create();
        
        Mat img_1 = imread("1.jpg");
        Mat img_2 = imread("2.jpg");
        //Detect the keypoints
        vector keypoints_1, keypoints_2;
        f2d->detect(img_1, keypoints_1);
        f2d->detect(img_2, keypoints_2);
        //Calculate descriptors (feature vectors)
        Mat descriptors_1, descriptors_2;
        f2d->compute(img_1, keypoints_1, descriptors_1);
        f2d->compute(img_2, keypoints_2, descriptors_2);
        //Matching descriptor vector using BFMatcher
        BFMatcher matcher;
        vector matches;
        matcher.match(descriptors_1, descriptors_2, matches);
        Mat img_matches;
        drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
        imshow("match", img_matches);
        waitKey(0);
    }
    

    更多特征点检测算法参考:http://blog.csdn.net/hust_bochu_xuchao/article/details/52153167

你可能感兴趣的:(OpenCV)