• 《opencv学习笔记》-- SURF 特征提取


    SURF算法为每个检测到的特征定义了位置和尺度,尺度值可用于定义围绕特征点的窗口大小。不论物体的尺度在窗口是什么样的,都将包含相同的视觉信息,这些信息用于表示特征点以使得它们与众不同。
    在特征匹配中,特征描述子通常用于N维向量,在光照不变以及少许透视变形的情况下很理想。另外,优质的描述子可以通过简单的距离测量进行比较,比如欧氏距离。
    使用 SURF 进行特征点描述主要是 drawMatches 方法和 Br u teFor ceMatcher类
    opencv \ sources \ modules \ legacy \ include \ opencv2 \ legacy\legacy.h pp路径下
    绘制匹配点: drawMatches()函数     绘制相匹配的两个图像的关键点
     
    1. void drawMatches(const Mat& img1, const vector& keypoints1,
    2. const Mat& img2, const vector& keypoints2,
    3. const vector& matches1to2, Mat& outImg,
    4. const Scalar& matchColor = Scalar::all(-1),
    5. const Scalar& singlePointColor = Scalar::all(-1),
    6. const vector<char>& matchesMask = vector<char>(),
    7. int flags = DrawMatchesFlags::DEFAULT)
    8. void drawMatches(const Mat& img1, const vector& keypoints1,
    9. const Mat& img2, const vector& keypoints2,
    10. const vector>& matches1to2, Mat& outImg,
    11. const Scalar& matchColor = Scalar::all(-1),
    12. const Scalar& singlePointcolor = Scalar::all(-1),
    13. const vectorchar>>& matchesMask = vectorchar>>(),
    14. int flags = DrawMatchesFlags::DEFAULT)

    参数1,const Mat&类型的 img1,第一幅源图像。

    参数2,const vector&类型的keypoints1,根据第一幅源图像得到的特征点。

    参数3,const Mat&类型的img2,第二幅源图像。

    参数4,const vector&类型的keypoints2,根据第二幅源图像得到的特征点。

    参数5,matches1to2,第一幅图像到第二幅图像的匹配点,即表示每一个图1中的特征点都

                 在图2中有一 一对应的点。

    参数6,Mat&类型的 outImg,输出图像,其内容取决于第五个参数标识符falgs。

    参数7,const Scalar&类型的matchColor,匹配的输出颜色,即线和关键点的颜色。

                 有默认值 Scalar::all(-1),表示颜色是随机生成的。

    参数8,const Scalar&类型的singlePointColor,单一特征点的颜色,表示随机生成颜色的

                 默认值 Scalar:.all(-1)。

    参数9,matchesMask,确定哪些匹配是会绘制出来的掩膜,如果掩膜为空,表示所有匹配

                 都进行绘制。

    参数10,int类型的flags ,特征绘制的标识符,有默认值DrawMatchesFlags::DEFAULT。

    枚举描述

    DEFAULT

    0

    创建输出图像矩阵(使用Mat : :create)。使用现存的输出图像绘制匹配对和特征点。且对每一个关键点,只绘制中间点

    DRAW_OVER_OUTIMG

    1

    不创建输出图像矩阵,而是在输出图像上绘制匹配对

    NOT_DRAW_SINGLE_POINTS

    2

    单个特征点不被绘制

    DRAW_RICH_KEYPOINTS

    3

    对每一个关键点,绘制带大小和方向的关键点圆圈

    BruteForceMatcher类 :

            继承BFMatcher 类(opencv sources\modules\features2d\include\opencv2\features2d\

                                    features2d.hpp )

    使用DescriptorExtractor接口来寻找关键点对应的特征向量。

    使用SurfDescriptorExtractor以及它的函数compute来完成特定的计算。

    使用 BruteForceMatcher来匹配特征向量。

    使用函数drawMatches来绘制检测到的匹配点。

    1. Mat srcImage1 = imread("1.jpg", 1);
    2. Mat srcImage2 = imread("2.jpg", 1);
    3. //使用SURF算子检测关键点
    4. //SURF算法中的hessian阈值
    5. int minHessian = 700;
    6. //定义一个SurfFeatureDetector(SURF)特征检测类对象
    7. SurfFeatureDetector detector(minHessian);
    8. std::vector keyPoints1, keyPoints2; //vector模板类,存放任意类型的动态数组
    9. //调用detect函数检测出 SURF特征关键点,保存在vector容器中
    10. detector.detect(srcImage1, keyPoints1);
    11. detector.detect(srcImage2, keyPoints2);
    12. //计算描述符(特征向量)
    13. SurfDescriptorExtractor extractor;
    14. Mat descriptors1, descriptors2;
    15. extractor.compute(srcImage1, keyPoints1, descriptors1);
    16. extractor.compute(srcImage2, keyPoints2, descriptors2);
    17. //使用BruteForce进行匹配
    18. //实例化一个匹配器
    19. BruteForceMatcherfloat>> matcher;
    20. std::vector matches;
    21. //匹配两幅图中的描述子(descriptors)
    22. matcher.match(descriptors1, descriptors2, matches);
    23. //绘制从两个图像中匹配出的关键点
    24. Mat imgMatches;
    25. //进行绘制
    26. drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, imgMatches);

  • 相关阅读:
    习题 --- 双指针算法、离散化
    批量多字段唯一性校验
    用Python登录账户
    手把手教你深度学习和实战-----循环神经网络
    CSS 中几种常用的换行方法
    瑞吉外卖项目Day07-缓存优化
    抓包工具简单介绍和 fiddler 安装
    Git clone 提示“Could not resolve hostname”解决
    金仓数据库WalMiner日志逻辑解码工具 (2. 概述)
    photoshop2024免费插件Portraiture3
  • 原文地址:https://blog.csdn.net/qq_41653875/article/details/126633940