• 《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);

  • 相关阅读:
    汇编层面来理解C语言的值传递和引用传递的区别
    若依框架前后端打包到linux部署,踩坑
    2022-07-01 多线程互斥锁的一个案例
    04-React路由5版本(高亮, 嵌套, 参数传递... )
    Lua中如何实现类似gdb的断点调试--04优化钩子事件处理
    【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计
    Redis简介+基础知识+五大基本数据类型+三大特殊数据类型基本使用+Redis到底是单线程还是多线程?
    R语言中的取整函数
    【Android】Android Studio 调用 类库
    BAT大厂的架构大数据你有了解么?解析大数据技术及算法
  • 原文地址:https://blog.csdn.net/qq_41653875/article/details/126633940