OpenCV(四十六):特征点匹配

2023-09-16 09:56:36

1.特征点匹配的定义

       特征点匹配是一种在两幅图像中寻找相互对应的特征点,并建立它们之间的对应关系的过程。具体而言,首先通过特征检测算法在两幅图像中寻找相互对应的特征点,然后,对于每个特征点,通过描述子提取算法计算其描述子,最后,使用匹配算法对两组特征点的描述子进行比较,以找到相互匹配的特征点对。

2.DMatch() 用于表示特征点匹配的数据结构

cv::DMatch::DMatch ( int   queryldx,

int    _trainldx,

int     _imgldx,

float  _distance

)

  • queryIdx:查询描述子集合中的索引
  • trainIdx:训练描述子集合中的索引
  • imgldx:训练描述子来自的图像索引
  • distance:两个描述符之间的距离

3.特征点匹配类DescriptorMatcher的介绍

        在OpenCV中,特征点匹配的类主要是cv::DescriptorMatcherDescriptorMatcher是一个抽象基类,用于特征点描述子之间的匹配操作。

DescriptorMatcher类有以下常用方法和函数

   1.match():对两组特征描述子进行匹配,返回匹配结果(DMatch对象的向量)。

void cv::DescriptorMatcher::match ( InputArray  queryDescriptors,

InputArray    trainDescriptors,

std::vector< DMatch > & matches,

InputArray     mask = noArray()

)const

  • queryDescriptors:查询描述子集合
  • trainDescriptors: 训练描述子集合
  • matches:两个集合描述子匹配结果
  • mask:描述子匹配时的掩码矩阵,用于指定匹配哪些描述子
  2.knnMatch():对两组特征描述子进行k近邻匹配,返回每个查询描述子的k个最佳匹配结果。

void cv::DescriptorMatcher::knnMatch ( InputArray   queryDescriptors,

InputArray   trainDescriptors,

std::vector< std::vector< DMatch > > & matches,

int     k,

InputArray   mask = noArray(),

bool    compactResult = false

)const

  • queryDescriptors:查询描述子集合
  • trainDescriptors: 训练描述子集合
  • matches:描述子匹配结果
  • k:每个查询描述子在训练描述子集合中寻找的最优匹配结果的数目
  • mask:描述子匹配时的掩码矩阵,用于指定匹配哪些描述子。
  • compactResult:输出匹配结果数目是否与查询描述子数目相同的选择标志
  3.radiusMatch():对两组特征描述子进行半径匹配,返回每个查询描述子在指定半径内的最佳匹配结果。

void cv::DescriptorMatcher::radiusMatch ( InputArray   queryDescriptors,

InputArray    trainDescriptors,

std::vector< std::vector< DMatch > > &matches,

float     maxDistance,

InputArray    mask = noArray(),

bool   compactResult = false

)const

  • queryDescriptors:查询描述子集合
  • trainDescriptors: 训练描述子集合
  • matches:描述子匹配结果
  • maxDistance:两个描述子之间满足匹配条件的距离阀值
  • mask:描述子匹配时的掩码矩阵,用于指定匹配哪些描述子
  • compactResult:输出匹配结果数目是否与查询描述子数目相同的选择标志

4.特征点匹配函数BFMatcher()

BFMatcher():暴力匹配

cv::BFMatcher::BFMatcher ( int normType =ORM_L2,

bool crossCheck = false

)

  • normType:两个描述子之间距离的类型标志,可以选择的参数为NORM_LI、NORM_L2、NORM_HAMMING和NORM_HAMMING2。
  • crossCheck:是否进行交叉检测的标志。

5.显示特征点匹配结果函数drawMatches()

void cv::drawMatches ( InputArray   img1,

const std::vector< KeyPoint > & keypoints1,

InputArray    img2,

const std::vector< KeyPoint > & keypoints2,

const std::vector< DMatch > &matches1to2,

InputOutputArray        outlmg,

const Scalar &         matchColor = scalar: :all(-1),

const Scalar &         singlePointColor = scalar: :all(-1),

const std::vector<char>&   matchesMask = std: :vector< char >(),

 DrawMatchesFlags     flags = DrawMatchesFlags: :DEFAULT

)

  • imgl:第一张图像。
  • keypointsl:第一张图像中的关键点
  • img2:第二张图像。
  • keypoints2:第二张图像中的关键点。
  • matcheslto2:第一张图像中关键点与第二张图像中关键点的匹配关系。
  • outImg:显示匹配结果的输出图像。
  • matchColor:连接线和关键点的颜色。
  • singlePointColor: 没有匹配点的关键点的颜色
  • matchesMask:匹配掩码
  • flags:绘制功能选择标志

6.示例代码


void orb_fearures(Mat &gray,vector<KeyPoint> &keypoints,Mat &descriptions){
    Ptr<ORB> orb=ORB::create(1000,1.2f);
    orb->detect(gray,keypoints);
    orb->compute(gray,keypoints,descriptions);
}
void Matcher_f(Mat img1,Mat img2){
    //提取特征点
    vector<KeyPoint> keypoints1,keypoints2;
    Mat descriptions1,descriptions2;
    //计算特征点
    orb_fearures(img1,keypoints1,descriptions1);
    orb_fearures(img2,keypoints2,descriptions2);
    //特征点匹配
    vector<DMatch> matches;//定义存放匹配结果的变量
    BFMatcher matcher(NORM_HAMMING);//定义特征点匹配的类,使用汉明距离
    matcher.match(descriptions1,descriptions2,matches);//进行特征点匹配
    ostringstream ss;
    ss<<"matches="<<matches.size()<<endl;//匹配成功特征点数目
    //通过汉明距离删选匹配结果
    double min_dist=1000,max_dist=0;
    for(int i=0;i<matches.size();i++){
        double dist=matches[i].distance;
        if(dist<min_dist) min_dist=dist;
        if(dist>max_dist) max_dist=dist;
    }
    //输出所有匹配结果中最大韩明距离和最小汉明距离
    ss<<"min_dist="<<min_dist<<endl;
    ss<<"max_dist="<<max_dist<<endl;
    //将汉明距离较大的匹配点对删除
    vector<DMatch> good_matches;
    for(int i=0;i<matches.size();i++){
        if(matches[i].distance<=max(2*min_dist,20.0)){
            good_matches.push_back(matches[i]);
        }
    }
    ss<<"good_min="<<good_matches.size()<<endl;//剩余特征点数目
    LOGD("%s",ss.str().c_str());

    //绘制匹配结果
    Mat outimg,outimg1;
    drawMatches(img1,keypoints1,img2,keypoints2,matches,outimg);
    drawMatches(img1,keypoints1,img2,keypoints2,good_matches,outimg1);

    //显示结果
    imwrite("/sdcard/DCIM/outimg.png",outimg);//未筛选结果
    imwrite("/sdcard/DCIM/outimg1.png",outimg1);//最小汉明距离筛选

}

未筛选的特征点匹配结果 :

最小汉明距离筛选特征点匹配结果:

更多推荐

多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)

目录多线程上下文设计模式Balking设计模式DocumentAutoSaveThreadDocumentEditThreadGuardedSuspension设计模式什么是GuardedSuspension设计模式GuardedSuspension的示例Latch设计模式TwoPhaseTermination设计模式

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1.涉及平台平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务)2.核心架构SpringCloud、SpringBoot、Mybatis、Redis3.前端框架VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程

Learn Prompt-什么是ChatGPT?

ChatGPT(生成式预训练变换器)是由OpenAI在2022年11月推出的聊天机器人。它建立在OpenAI的GPT-3.5大型语言模型之上,并采用了监督学习和强化学习技术进行了微调。ChatGPT是一种聊天机器人,允许用户与基于计算机的代理进行对话。它通过使用机器学习算法分析文本输入并生成旨在模仿人类对话的响应来工作

.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

这是我们计划在今年晚些时候发布的最终.NET8版本之前的两个候选版本中的第一个。大部分计划中的功能和变更都包含在这个候选版本中,可以供您尝试使用。您可以在文档中找到完整的ASP.NETCore在.NET8中的新功能列表。一些领域(尤其是Blazor)仍然有一些重大的变更待完成,我们预计将在下一个.NET8候选版本中完成

从零开发短视频电商 使用Spring WebClient发起远程Http调用

文章目录依赖使用创建WebClient实例创建带有超时的WebClient实例示例请求准备获取响应高级过滤器自定义过滤器自定义线程池自定义WebClient连接池开启日志错误处理最佳实践示例异步请求同步请求上传文件重试过滤错误错误处理参考SpringWebClient是SpringWebFlux项目中Spring5中引

软件工程之总体设计

总体设计是软件工程中的一个重要阶段,它关注整个系统的结构和组织,旨在将系统需求转化为可执行的软件解决方案。总体设计决定了系统的架构、模块划分、功能组织以及数据流和控制流等关键方面。可行性研究具体方面:经济可行性、技术可行性、操作可行性、法律可行性、时间可行性软件计划书是用管理员,技术人员和用户都能理解的术语来描述的具体

阿里云——云服务器基础运维与管理

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。座右铭:低头赶路,敬事如仪个人主页:网络豆的主页​​​​​目录写在前面学习目标:一.3个理由拥抱云服务器1.什么是云服务器2.使用云服务的好处3.推荐云服务的理由二.1分钟快速定制ECS1.开通ECS步骤:ECS概念三.3分钟便捷管理ECS1.便捷管理,

扩散模型在图像生成中的应用:从真实样例到逼真图像的奇妙转变

一、扩散模型扩散模型的起源可以追溯到热力学中的扩散过程。热力学中的扩散过程是指物质从高浓度往低浓度的地方流动,最终达到一种动态的平衡。这个过程就是一个扩散过程。在深度学习领域中,扩散模型(diffusionmodels)是深度生成模型中新的SOTA。扩散模型在图片生成任务中超越了原SOTA:GAN,并且在诸多应用领域都

06-数据库检索:如何使用B-树对海量磁盘数据建立索引?

06-数据库检索:如何使用B-树对海量磁盘数据建立索引?你好,我是陈东。在基础篇中,我们学习了许多和检索相关的数据结构和技术。但是在大规模的数据环境下,这些技术的应用往往会遇到一些问题,比如说,无法将数据全部加载进内存。再比如说,无法支持索引的高效实时更新。而且,对于复杂的系统和业务场景,我们往往需要对基础的检索技术进

Web服务(Web Service)

简介Web服务(WebService)是一种Web应用开发技术,用XML描述、发布、发现Web服务。它可以跨平台、进行分布式部署。Web服务包含了一套标准,例如SOAP、WSDL、UDDI,定义了应用程序如何在Web上实现互操作。Web服务的服务端和客户端使用简单对象访问协议(SOAP)进行通信,通信的双方可以使用不同

Jmeter系列-监听器Listeners的介绍(9)

简介用来动态的监控Jmeter执行测试的过程,实时查看测试结果。JMeter监听器查看结果树查看结果树,显示取样器请求和响应的细节以及请求结果,包括消息头,请求的数据,响应的数据,方便接口调试,问题定位。参数介绍名称:控制器的描述性名称,显示在左边节点上,并用于命名事务注释:控制器注释信息,非必填项文件名:载入文件名L

热文推荐