OpenCV图像拼接(3)图像拼接的类cv::detail::BestOf2NearestMatcher

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

特征匹配器,为每个特征找到两个最佳匹配,并且仅在描述符距离之间的比率大于阈值 match_conf 时保留最佳的一个。

cv::detail::BestOf2NearestMatcher 是 OpenCV 库中用于图像拼接的一个类,特别适用于全景图生成过程中特征匹配的环节。它通过寻找最佳的两个最近邻匹配来提高匹配准确性,从而确定不同图像之间的对应关系。下面是对这个类的一些基本介绍和使用说明。

主要功能

  • 两近邻匹配:该类实现了基于最佳两近邻距离比测试的方法来进行特征匹配。这种方法假设正确的匹配通常是第一个最邻近且显著不同于第二个最邻近的点。

常用成员函数

  • match():执行特征点描述符之间的匹配。注意,这个方法在较新的OpenCV版本中可能是保护成员,因此需要通过实例化对象后直接调用(例如使用 operator())或者继承此类来访问。
  • collectGarbage():清理内部存储以释放内存。

代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/stitching/detail/matchers.hpp>

using namespace cv;
using namespace cv::detail;

void drawMatchingResult(const Mat& img1, const Mat& img2, const std::vector<KeyPoint>& keypoints1,
                        const std::vector<KeyPoint>& keypoints2, const std::vector<DMatch>& matches)
{
    // 创建一个输出图像来展示两张图片和它们之间的匹配
    Mat outputImg;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, outputImg,
                Scalar::all(-1), Scalar::all(-1), std::vector<char>(),
                DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

    // 显示匹配结果
    imshow("Feature Matches", outputImg);
    waitKey(0);
}

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 << "Could not open or find the images!" << std::endl;
        return -1;
    }

    // 初始化ORB特征检测器
    Ptr<Feature2D> feature_detector = ORB::create();

    // 检测特征点并计算描述符
    std::vector<KeyPoint> keypoints1, keypoints2;
    Mat descriptors1, descriptors2;
    feature_detector->detectAndCompute(img1, noArray(), keypoints1, descriptors1);
    feature_detector->detectAndCompute(img2, noArray(), keypoints2, descriptors2);

    // 创建ImageFeatures对象并将特征点和描述符填入
    ImageFeatures features1, features2;
    features1.img_idx = 0; // 图片索引
    features1.keypoints = keypoints1;
    features1.descriptors = descriptors1.getUMat(ACCESS_READ); // 使用getUMat方法转换

    features2.img_idx = 1; // 图片索引
    features2.keypoints = keypoints2;
    features2.descriptors = descriptors2.getUMat(ACCESS_READ); // 使用getUMat方法转换

    // 创建BestOf2NearestMatcher实例
    Ptr<BestOf2NearestMatcher> matcher = BestOf2NearestMatcher::create();

    // 使用()运算符来进行匹配
    MatchesInfo matches_info;
    (*matcher)(features1, features2, matches_info);

    // 输出匹配结果的数量
    std::cout << "Found " << matches_info.matches.size() << " matches" << std::endl;

    // 将MatchesInfo中的matches转换为std::vector<DMatch>类型,以便于绘制
    std::vector<DMatch> matches_vector(matches_info.matches.begin(), matches_info.matches.end());

    // 绘制匹配结果
    drawMatchingResult(img1, img2, keypoints1, keypoints2, matches_vector);

    return 0;
}

运行结果

相关推荐
zhangfeng11333 分钟前
氨基酸序列表示法,蛋白质序列表达 计算机中机器学习 大语言模型中的表达,为什么没有糖蛋白或者其他基团磷酸化甲基化乙酰化泛素化
人工智能·机器学习·语言模型
陈天伟教授14 分钟前
人工智能应用- 语言理解:06.大语言模型
人工智能·语言模型·自然语言处理
海心焱22 分钟前
安全之盾:深度解析 MCP 如何缝合企业级 SSO 身份验证体系,构建可信 AI 数据通道
人工智能·安全
2501_9453184925 分钟前
AI证书能否作为招聘/培训标准?2026最新
人工智能
2601_9491465325 分钟前
Python语音通知接口接入教程:开发者快速集成AI语音API的脚本实现
人工智能·python·语音识别
韦东东25 分钟前
RAGFlow v0.20的Agent重大更新:text2sql的Agent案例测试
人工智能·大模型·agent·text2sql·ragflow
人工智能AI技术29 分钟前
DeepSeek-OCR 2实战:让AI像人一样“看懂”复杂文档
人工智能
OpenBayes1 小时前
教程上新|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
人工智能·深度学习·目标检测·机器学习·大模型·ocr·gpu算力
冰糖猕猴桃1 小时前
【AI】把“大杂烩抽取”拆成多步推理:一个从单提示到多阶段管线的实践案例
大数据·人工智能·ai·提示词·多步推理
PPIO派欧云1 小时前
PPIO上线GLM-OCR:0.9B参数SOTA性能,支持一键部署
人工智能·ai·大模型·ocr·智谱