C/C++开发,opencv-features2d模块,SIFT等特征检测器应用

目录

一、OpenCV-features2d 模块简介

1.1 features2d 模块信息

1.2 features2d 模块应用流程

二、features2d 模块编码案例

2.1 实现逻辑

2.2 features2d 模块应用程序代码

2.3 程序编译及运行


一、OpenCV-features2d 模块简介

1.1 features2d 模块信息

  features2d 是 OpenCV 中的一个模块,它提供了大量的二维特征检测、描述和匹配算法。

features2d 模块的类及函数包含在modules\features2d\include\opencv2\features2d.hpp,

#include <opencv2/opencv.hpp>  
#include <opencv2/features2d.hpp>  

以下是一些 features2d 模块中常用的类和函数:

  1. 特征检测器

    • cv::FastFeatureDetector:基于 FAST(Features from Accelerated Segment Test)算法的特征检测器。
    • cv::ORB:Oriented FAST and Rotated BRIEF 特征检测器和描述子。
    • cv::SIFT:Scale-Invariant Feature Transform 特征检测器和描述子(在某些版本的 OpenCV 中可能需要额外安装)。
    • cv::SURF:Speeded Up Robust Features 特征检测器和描述子(在某些版本的 OpenCV 中可能需要额外安装,并且可能由于版权问题而不再被推荐使用)。
    • cv::AgastFeatureDetector:基于 AGAST(Adaptive and Generic Accelerated Segment Test)算法的特征检测器。
    • cv::MSER:Maximally Stable Extremal Regions 特征检测器。
    • cv::SimpleBlobDetector:用于检测图像中的简单斑点或圆形结构的检测器。
  2. 描述子

    • 除了 SIFT 和 SURF 之外,许多特征检测器也提供了与之关联的描述子。
    • 描述子用于量化特征周围的图像区域,以便在后续步骤中进行特征匹配。
  3. 特征匹配

    • cv::DescriptorMatcher:一个类,用于匹配来自两个不同图像的特征描述子。它提供了许多匹配方法,如暴力匹配(Brute-Force Matcher)和 FLANN(Fast Library for Approximate Nearest Neighbors)匹配。
    • cv::drawMatches:一个函数,用于在图像上绘制匹配的特征对。
  4. 特征匹配评估

    • cv::BFMatcher::knnMatch:对于每个查询描述子,找到 k 个最佳匹配。
    • cv::DescriptorMatcher::radiusMatch:对于每个查询描述子,找到与其距离在指定半径内的所有匹配。
    • 评估匹配质量的方法,如比率测试(Ratio Test)和交叉检查(Cross-Check)。
  5. 非极大值抑制

    • 在某些情况下,检测到的特征可能过于密集,需要进行非极大值抑制(NMS)以减少冗余特征。
  6. 关键点数据结构

    • cv::KeyPoint:一个类,用于表示检测到的关键点(特征)的位置、大小、方向等信息。
1.2 features2d 模块应用流程

        使用 features2d 模块时,通常的流程是:

  1. 加载或捕获图像。
  2. 使用特征检测器检测关键点。
  3. 对于每个关键点,使用描述子算法计算描述子。
  4. 使用描述子匹配器匹配来自两个不同图像的描述子。
  5. 评估匹配质量,并可能使用非极大值抑制来减少冗余匹配。
  6. 可视化匹配结果或进行后续处理。

二、features2d 模块编码案例

2.1 实现逻辑

1. 读取图片数据

        使用imread读取图片数据,存入cv::Mat。

2.使用 SIFT等特征检测器及关键点检测

        SIFT(Scale-Invariant Feature Transform)常用的特征检测器和描述子,对于尺度、旋转和光照变化都具有一定的鲁棒性。这些特征可以用于在两张图像之间找到匹配的特征点,从而进行图像匹配或拼接。

        或ORB(Oriented FAST and Rotated BRIEF)是一种快速的特征检测器和描述子,它结合了 FAST 特征检测器和 BRIEF 描述子的优点,具有较快的处理速度和较好的性能。ORB 可以用于实时图像处理任务,如视频中的物体跟踪。

3. 进行图像匹配

        使用 FLANN 匹配器进行特征匹配,检测每张图像中的特征点,并使用特征匹配器找到这些特征点之间的对应关系。

4.绘制匹配结果并显示或其操作,如图像拼接、物体识别

        使用cv::drawMatches绘制匹配结果。或者进行图像拼接、物体识别等后续操作。

        PS:图像拼接是一种将多张图像合并成一张大图像的技术。使用 features2d 模块,可以检测每张图像中的特征点,并使用特征匹配器找到这些特征点之间的对应关系。然后,通过计算透视变换矩阵,可以将这些图像拼接成一张大图像。

        物体识别是一种通过比较图像中的特征点来识别物体的技术。使用 features2d 模块,可以检测待识别图像中的特征点,并与已知物体的特征点进行比较。如果找到了足够多的匹配点,则可以认为待识别图像中包含已知物体。

        全息照相法是一种基于特征点的物体识别方法,它通过比较特征点之间的关系来判断物体是否存在。使用 features2d 模块,可以提取参考图像和待检测图像中的特征点,并使用特征匹配器找到这些特征点之间的对应关系。然后,通过比较匹配点的数量和分布情况,可以判断待检测图像中是否包含已知物体。

2.2 features2d 模块应用程序代码

        main.cpp

#include <opencv2/opencv.hpp>  
#include <opencv2/features2d.hpp>  
#include <iostream>int main(int argc, char** argv) 
{  // 加载图像  cv::Mat img1 = cv::imread("image_1.jpg", cv::IMREAD_COLOR);  cv::Mat img2 = cv::imread("image_2.jpg", cv::IMREAD_COLOR);  // 初始化 SIFT 特征检测器  // cv::Ptr<cv::SIFT> detector = cv::SIFT::create();  // 初始化 ORB 特征检测器  // cv::Ptr<cv::ORB> detector = cv::ORB::create(); // 初始化 BRISK 特征检测器  cv::Ptr<cv::BRISK> detector = cv::BRISK::create(); // 检测关键点并计算描述子  std::vector<cv::KeyPoint> keypoints1, keypoints2;  cv::Mat descriptors1, descriptors2;  detector->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);  detector->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);  //ORB和BRISK 特征需转换mat类型descriptors1.convertTo(descriptors1,CV_32FC1);descriptors2.convertTo(descriptors2,CV_32FC1);int type = descriptors1.type();  int depth = CV_MAT_DEPTH(type);  int channels = CV_MAT_CN(type);  std::cout << "image type: " << type     << std::endl;  std::cout << "depth:      " << depth    << std::endl;  std::cout << "channels:   " << channels << std::endl;  // 使用 FLANN 匹配器进行特征匹配  cv::FlannBasedMatcher matcher;  std::vector<cv::DMatch> matches;  matcher.match(descriptors1, descriptors2, matches);  // 绘制匹配结果并显示  cv::Mat imgMatches;  cv::drawMatches(img1, keypoints1, img2, keypoints2, matches, imgMatches);  cv::imshow("Matches", imgMatches);  cv::waitKey(0);  //进一步进行图像拼接等操作 ...  return 0;  
}
2.3 程序编译及运行

        本文是采用win系统下,opencv采用MinGW编译的静态库(C/C++开发,win下OpenCV+MinGW编译环境搭建_opencv mingw-CSDN博客),建立makefile:

#/bin/sh
#win32
CX= g++ -DWIN32 
#linux
#CX= g++ -Dlinux BIN 		:= ./
TARGET      := opencv_features2d01.exe
FLAGS		:= -std=c++11 -static
SRCDIR 		:= ./
#INCLUDES
INCLUDEDIR 	:= -I"../../opencv_MinGW/include" -I"./"
#-I"$(SRCDIR)"
staticDir   := ../../opencv_MinGW/x64/mingw/staticlib/
#LIBDIR		:= $(staticDir)/libopencv_world460.a\
#			   $(staticDir)/libade.a \
#			   $(staticDir)/libIlmImf.a \
#			   $(staticDir)/libquirc.a \
#			   $(staticDir)/libzlib.a \
#			   $(wildcard $(staticDir)/liblib*.a) \
#			   -lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
#opencv_world放弃前,然后是opencv依赖的第三方库,后面的库是MinGW编译工具的库LIBDIR 	    := -L $(staticDir) -lopencv_world460 -lade -lIlmImf -lquirc -lzlib \-llibjpeg-turbo -llibopenjp2 -llibpng -llibprotobuf -llibtiff -llibwebp \-lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
source		:= $(wildcard $(SRCDIR)/*.cpp) $(TARGET) :$(CX) $(FLAGS) $(INCLUDEDIR) $(source)  -o $(BIN)/$(TARGET) $(LIBDIR)clean:rm  $(BIN)/$(TARGET)

        编译如下:

        下载两张类似图片,放置目录下,

程序运行输出如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

炒美股怎么开户?

近年来&#xff0c;随着国内投资者对境外投资需求的不断增长&#xff0c;炒美股逐渐成为许多投资者的选择。然而&#xff0c;随着监管政策的不断完善&#xff0c;传统的互联网券商开户方式已经不再适用。那么&#xff0c;对于想要入场美股市场的投资者来说&#xff0c;该如何开…

Angular中的路由

Angular中的路由 文章目录 Angular中的路由前言一、创建路由二、创建多个组件路由三、创建子路由四、创建多个组件子路由 前言 在Angular中&#xff0c;路由是用于在不同的视图和组件之间导航的机制。Angular提供了一种强大的路由机制来管理单页应用&#xff08;SPA&#xff0…

vue2项目升级到vue3经历分享4

后端重构&#xff0c;如果接口做好抽象封装&#xff0c;只需要考虑jar之间的兼容性问题&#xff0c;jdk版本不变&#xff0c;基本不用做太大的调整&#xff0c;但是前端就不一样&#xff0c;除了vue框架本身&#xff0c;css的调整&#xff0c;改起来更是让人头疼。前面写了vue2…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候&#xff0c;装在SD卡的apk和装在系统盘的apk扫描过程不一样&#xff0c;系统盘apk在系统启动过程中扫描&#xff0c;而SD卡上的就不是&#xff0c;等系统启动好了才挂载、扫描&#xff0c;下面就说下SD扫描的流程&#xff1a; 在SystemServer启动MountService&am…

【Hadoop】MapReduce (七)

MapReduce 执行流程 MapTask执行流程 Read&#xff1a;读取阶段 MapTask会调用InputFormat中的getSplits方法来对文件进行切片切片之后&#xff0c;针对每一个Split&#xff0c;产生一个RecordReader流用于读取数据数据是以Key-Value形式来产生&#xff0c;交给map方法来处理…

02_SpringBoot程序快速启动

目录 打包命令启动启动成功测试结果 打包 点击package打包命令&#xff0c;会生成target目录&#xff0c;目录下会有生成的jar包 命令启动 打开cmd命令窗口&#xff0c;进入子项目的target目录下,输入命令后&#xff0c;回车… java -jar .\note-boot-core-1.0-SNAPSHOT.j…

C++新手村指南:入门基础

目录 C概念 C发展史 C关键字&#xff08;C98&#xff09; 命名空间 命名空间的定义 命名空间的使用 C中的输入&&输出 缺省参数 缺省参数的概念 缺省参数的分类 函数重载 函数重载概念 函数重载实现 引用 引用的概念 引用的特性 常引用 引用的使用场景…

【Python图像分类系列】建立CNN模型实现猫狗图像分类(案例+源码)

这是我的第275篇原创文章。 一、引言 基于CNN卷积神经网络在图像识别领域的应用&#xff1a;猫狗图像识别。主要内容包含&#xff1a; 数据创建和预处理 神经网络模型搭建 神经网络模型的训练和拟合 文中使用的深度学习框架是Keras。部分数据展示&#xff1a; 猫&#xf…

基于opencv的车辆统计

车辆统计&#xff09; 一、项目背景二、整体流程三、常用滤波器的特点四、背景减除五、形态学开运算闭运算 六、项目完整代码七、参考资料 一、项目背景 检测并识别视频中来往车辆的数量 最终效果图&#xff1a; 二、整体流程 加载视频图像预处理&#xff08;去噪、背景减除…

C++类和对象中篇

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;[C] &#x1f4a8;路漫漫其修远兮 吾将而求索 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 &#x1f4d4;前言&#x1f4d4;1、类的六个…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

小麦穗检测数据集VOC+YOLO格式6508张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6508 标注数量(xml文件个数)&#xff1a;6508 标注数量(txt文件个数)&#xff1a;6508 标注…

实践指南:如何将SpringBoot项目无缝部署到Tomcat服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

JS-拖拽元素放大缩小

效果左右布局&#xff0c;拖拽后&#xff0c;宽度放大缩小 其实自己写也可以&#xff0c;不过还是发现了两个好用的js库&#xff0c;既然不需要自己写&#xff0c;当然是能偷懒就偷懒 1、resizerjs 官网地址&#xff1a;https://github.com/eknowles/resizerjs <!doctype …

ssrf初步

一&#xff0c;简介 全称&#xff1a;Server-Side Request Forgery&#xff08;中文&#xff1a;服务器端请求伪造&#xff09; 攻击者从服务端发起请求&#xff0c;让服务器连接任意外部系统&#xff0c;从而泄露敏感数据。主要利用各种协议的请求伪造&#xff0c;例如php协…

IDEA使用Maven生成普通项目没有生成iml文件解决方法

右击主目录选择&#xff1a; Open in Terminal 在生成的控制台输入&#xff1a; mvn idea:module 回车便自动生成iml文件啦&#xff01; 双击下主目录就可以看见啦

数据分析概念定义和发展前景

数据分析概念定义和发展前景 前言一、数据分析概念二、数据的定义数据的定义数据的分类定性数据定量数据 三、数据的价值数据为什么具有价值 四、数据分析的目的对于企业来说总结 五、数据分析类型的划分描述性统计分析探索性数据分析传统的统计分析方法验证性数据分析 六、 数…

【亲测可用】linux centos7.9 快速安装python3环境 手把手实操教程

安装好linux centos7.9 默认只有python2的环境如下&#xff1a; python2.7.5这个很老旧的版本了&#xff0c;有很多新库不支持&#xff0c;性能可能也不行。 接下来快速安装python3环境&#xff0c;并设置源做到快速安装包&#xff0c;设置虚拟环境&#xff0c;打造强大的pyth…

MacOS搭建docker本地私有镜像库

相关环境 macOS: bigsur 11.7.8 docker desktop: 4.22.0 docker engine: 24.0.5 准备工作 本机已经安装好docker desktop&#xff0c;未安装的自行参考其他教程。如果不能翻墙&#xff0c;可以修改本地的镜像地址&#xff0c;可在docker desktop 设置中的docker engine中修…

Redis-新数据类型-Bitmaps

新数据类型-Bitmaps 简介 在计算机中&#xff0c;用二进制&#xff08;位&#xff09;作为存储信息的基本单位&#xff0c;1个字节等于8位。 例如 “abc” 字符串是由 3 个字节组成&#xff0c;计算机存储时使用其二进制表示&#xff0c;"abc"分别对应的ASCII码是 …