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

这篇具有很好参考价值的文章主要介绍了OpenCV(四十六):特征点匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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);//最小汉明距离筛选

}

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

opencv 特征匹配,Android之OpenCV,opencv,人工智能,计算机视觉,C++

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

opencv 特征匹配,Android之OpenCV,opencv,人工智能,计算机视觉,C++文章来源地址https://www.toymoban.com/news/detail-732553.html

到了这里,关于OpenCV(四十六):特征点匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv特征匹配算法原理

    算法步骤: FAST进行特征点提取是根据当前点领域内的点的差值作为特征点的筛选标准 ( 1 ) 选择像素 p ,该像素值为 I p ,确定筛选阈值 T ( 2 ) 计算以 p 为圆心 3 为半径的 16 个像素点的灰度值 I x 和圆心 p 的灰度值 I p 的差值,如果存在连续 n 个点(算法第一个版本为 12 ) 满

    2024年02月03日
    浏览(31)
  • 【OpenCV 例程 300篇】251. 特征匹配之暴力匹配

    『youcans 的 OpenCV 例程300篇 - 总目录』 特征匹配是特征检测和特征描述的基本应用,在在图像拼接、目标识别、三维重建等领域的应用非常广泛。 基于特征描述符的特征点匹配是通过对两幅图像的特征点集合内的关键点描述符的相似性比对来实现的。分别对参考图像(Refere

    2024年02月02日
    浏览(32)
  • openCV 图像特征点检测与匹配

            1.图像搜索,以图搜图。         2.拼图游戏。         3.图像拼接,将两张有关联的图拼接在一起。         图像特征就是指有意义的图像区域,具有独特性、易于识别性,比如角点、斑点以及高密度区。          从上图我们可以发现:         A、

    2024年02月09日
    浏览(75)
  • 004 OpenCV akaze特征点检测匹配

    目录 一、环境 二、akaze特征点算法 2.1、基本原理 2.2、实现过程 2.3、实际应用 2.4、优点与不足 三、代码 3.1、数据准备 3.2、完整代码 本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 特征点检测算法AKAZE是一种广泛应用于图像处理领域的算法,它可以在不同尺度下提取

    2024年02月02日
    浏览(27)
  • OpenCV(图像处理)-基于Python-特征检测-特征点匹配

    图像特征就是指有意义的图像区域,具有独特性,易于识别性,比如角点、斑点以及高密度区。而为什么角点具有重要的特征呢? 看下图: 观察ABD三张图片,我们不容易得知图像的位置,而CEF三张图我们特别容易找到它们在原图中对应的位置,这是因为ABD比较平滑,我们不

    2024年02月03日
    浏览(33)
  • OpenCV 入门教程:轮廓特征和轮廓匹配

    轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。

    2024年02月13日
    浏览(35)
  • Opencv(C++)学习系列---特征点检测和匹配

    关于特征检测和匹配的具体原理会在后续的文章中具体讲解,本文主要介绍Opencv实现的简单过程: 第一步:定义特征检测器(SIFT,SURF,ORB等)。 第二步:对图像中特征点进行检测,并将特征点存储在Keypoints中。 第三步:提取特征点的描述信息。 第四步:定义特征匹配器(特

    2024年02月04日
    浏览(26)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(33)
  • LightGlue-OpenCV 实现实时相机图片特征点匹配

    LightGlue 是一种新的基于深度神经网络,用来匹配图像中的局部特征的深度匹配器。是 SuperGlue 的加强版本。相比于 SuperGlue,LightGlue 在内存和计算方面更高效,同时结果更准确,也更容易训练。 其 原项目地址 如下: https://github.com/cvg/LightGlue 近期由于实习项目需要,需要在相

    2024年01月18日
    浏览(39)
  • OpenCV Python – 使用SIFT实现两张图片的特征匹配

     我们使用尺度不变特征变换(  SIFT  )特征描述符和暴力匹配算法实现两张图像的特征匹配。其中,  SIFT  用于找到图像中的关键点和描述符,而  暴力匹配算法  用于在两张图像中匹配描述符。 要使用  SIFT  特征检查器和  暴力  匹配算法实现两张图像的特征匹配,可

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包