OpenCV图像拼接(2)特征查找与图像匹配之基于仿射变换的图像匹配的一个类cv::detail::AffineBestOf2NearestMatcher

embedded/2025/3/19 23:22:03/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::detail::AffineBestOf2NearestMatcher 是 OpenCV 库中用于实现基于仿射变换的图像匹配的一个类。这个类主要用于在图像拼接流程中,寻找图像间的对应关系,并假设图像间存在仿射变换(即考虑缩放、旋转和平移的变换)。它通过使用“最佳二近邻”策略来提高匹配的准确性,即对于每个特征点,找到其最近邻和次近邻,只有当最近邻与次近邻的距离比值小于一定阈值时,才认为匹配成功,以此来过滤掉不准确的匹配。

主要功能

  • 特征匹配:该类主要负责在给定的两幅或多幅图像之间进行特征点匹配。
  • 仿射变换估计:基于找到的匹配点对,估计图像之间的仿射变换参数。

使用场景

适用于需要对具有相同或相似平面视图的图像进行拼接的情况,例如扫描文档或物体表面的照片拼接。由于仿射变换模型相对简单,因此计算效率较高,但在处理透视变换较大的图像时可能不如单应性模型效果好。

相关方法

虽然具体的API可能会根据OpenCV版本有所变化,但通常这类匹配器会提供如下几种典型的方法:

  • 创建匹配器对象。
  • 设置匹配过程中的参数,如距离比率阈值等。
  • 执行特征匹配操作。
  • 获取匹配结果。

为了使用 cv::detail::AffineBestOf2NearestMatcher 类,你需要先确保你的项目已经正确配置了OpenCV库,并且包含了相应的头文件。然后可以通过实例化该类并调用其提供的接口来进行特征查找和匹配工作。

以下是一些关键的成员函数和属性介绍:

  • 构造函数

    AffineBestOf2NearestMatcher:构造函数可能允许设置一些初始化参数,如是否使用引导图(guided filtering)、对称匹配标志(symmetric matching flag)等。

  • 成员函数

    • operator():重载的括号操作符,用于执行实际的匹配过程。接受源图像和目标图像的特征点集以及描述符作为输入,并输出匹配结果。

    • match:具体实现匹配逻辑的方法,通常在内部调用。它会根据输入的特征点和描述符来计算两幅图像之间的最佳仿射变换匹配。

    • collectGarbage:清理不再需要的数据,释放内存。

  • 属性

    • confidenceThreshold:置信度阈值,用于决定哪些匹配是可靠的。这个阈值影响最近邻与次近邻距离比的判断标准。

    • maxInliers:定义最大内点数,用于RANSAC或其他模型验证方法中的内点选择。

    • matcher:指向底层特征点匹配器的指针,通常是cv::BFMatcher或cv::FlannBasedMatcher。

    • affineEstimator:用于估计仿射变换矩阵的组件。

    代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/stitching/detail/matchers.hpp>using namespace cv;
using namespace cv::detail;int main()
{// 读取两幅图像Mat img1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png" );Mat img2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/stich2.png" );if ( img1.empty() || img2.empty() ){std::cerr << "无法加载图像" << std::endl;return -1;}// 初始化ORB特征检测器和描述符提取器Ptr< Feature2D > featureDetector = ORB::create();// 检测特征点和计算描述符std::vector< KeyPoint > keypoints1, keypoints2;Mat descriptors1, descriptors2;featureDetector->detectAndCompute( img1, noArray(), keypoints1, descriptors1 );featureDetector->detectAndCompute( img2, noArray(), keypoints2, descriptors2 );// 创建AffineBestOf2NearestMatcher实例Ptr< AffineBestOf2NearestMatcher > matcher = makePtr< AffineBestOf2NearestMatcher >( true, 0.3 );  // 设置对称匹配为true,距离比率阈值为0.3// 将特征点和描述符封装到ImageFeatures结构中ImageFeatures features1, features2;features1.img_idx   = 0;features2.img_idx   = 1;features1.keypoints = keypoints1;features2.keypoints = keypoints2;// 使用.getUMat(ACCESS_READ)方法将Mat类型的描述符转换为UMat类型features1.descriptors = descriptors1.getUMat( cv::ACCESS_READ );features2.descriptors = descriptors2.getUMat( cv::ACCESS_READ );// 存储匹配结果MatchesInfo matches_info;// 执行匹配matcher->operator()( features1, features2, matches_info );// 提取匹配结果std::vector< DMatch > good_matches;for ( const auto& m : matches_info.matches ){if ( m.distance < 0.3 ){  // 使用一个简单的距离阈值来过滤匹配good_matches.push_back( m );}}// 绘制匹配结果Mat img_matches;drawMatches( img1, keypoints1, img2, keypoints2, good_matches, img_matches );// 显示匹配结果imshow( "Affine Matches", img_matches );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/embedded/173978.html

相关文章

【智能搜索引擎技术】第二章信息采集(自用)

1.扩展知识&#xff1a;万维网&#xff08;World Wide Web&#xff09; 万维网&#xff0c;通常简称为WWW&#xff0c;是一个由互联网上的各种信息资源组成的系统。它通过超文本链接将不同的网页连接在一起&#xff0c;使用户能够方便地访问和浏览这些信息。万维网的核心技术包…

Docker build 会在本地产生巨大的文件

Docker build 会在本地产生巨大的文件&#xff0c; 比如 用 这个命令列出本地镜像 docker images 可见size都是很大的&#xff0c; 到docker目录下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用这个命令把不用的镜像删掉了&#xff1a; &#xff08;rmi后面是镜像id&a…

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1&#xff09;什么是拓扑排序 对一个有向无环图G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若&#xff0c;则u在线性序列中出现在v之前。 2&#xff09;拓扑排序的操作方法 重复执行…

golang-type关键字

type 关键字 Type关键字在Go语言中作用很重要&#xff0c;他主要用来实现两个功能: 【自定义类型】 自定义类型底层是一种类型&#xff0c;但是不会拥有底层类型的方法。 自定义类型与底层类型相比是一种新类型&#xff0c;二者之间需要显式类型转换。 //语法 type 自定义类型…

【C++多线程】thread

C中的std::thread是C11引入的线程库的一部分&#xff0c;提供了创建和管理线程的能力。它封装了操作系统的线程接口&#xff0c;使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中&#xff0c;定义在std命名空间下&#xff…

mac npm run dev报错 error:0308010C:digital envelope routines::unsupported

并且提示 Unsupported engine { npm WARN EBADENGINE package: achrinza/node-ipc9.2.2, npm WARN EBADENGINE required: { node: 8 || 10 || 12 || 14 || 16 || 17 }, npm WARN EBADENGINE current: { node: v18.18.0, npm: 9.8.1 } npm WARN EBADENGINE } package.jso…

2024华东师范大学计算机复试上机真题

2024华东师范大学计算机复试机试真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2024华东师范大学计算机复试上机真题 2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 在线评测&#xff1a;传动门&#xff1a;pgcode…

Leetcode 刷题笔记1 图论part01

图论的基础知识&#xff1a; 图的种类&#xff1a; 有向图&#xff08;边有方向&#xff09; 、 无向图&#xff08;边无方向&#xff09;、加权有向图&#xff08;边有方向和权值&#xff09; 度&#xff1a; 无向图中几条边连接该节点&#xff0c;该节点就有几度&#xff1…