OpenCV旋转估计(4)生成一个字符串表示的匹配图函数 matchesGraphAsString()

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

算法描述

matchesGraphAsString 函数是OpenCV库中的一部分,位于 cv::detail 命名空间下。这个函数的主要作用是生成一个字符串表示的匹配图(matches graph),其中包含了一系列图像路径和它们之间的匹配信息。这对于调试或者可视化图像拼接过程中的匹配关系非常有用。

函数原型

cpp 复制代码
String cv::detail::matchesGraphAsString 	
(
	 	std::vector< String > &  	paths,
		std::vector< MatchesInfo > &  	pairwise_matches,
		float  	conf_threshold 
) 	

参数

  • paths: 一个字符串向量,包含了参与匹配的所有图像的路径。
  • pairwise_matches: 包含了每对图像之间匹配信息的向量。每个MatchesInfo结构体通常包含关键点匹配、匹配的质量等信息。
  • conf_threshold: 置信度阈值,用于过滤掉那些被认为不够可靠的匹配。

返回值

返回一个字符串,表示图像匹配图。该字符串格式化为易于阅读的形式,可以用来展示哪些图像与哪些图像相匹配及其置信度等信息。

代码示例

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

using namespace cv;
using namespace cv::detail;

int main()
{
    // 示例图像路径
    std::vector< String > paths = { "/media/dingxin/data/study/OpenCV/sources/images/stich1.png", "/media/dingxin/data/study/OpenCV/sources/images/stich2.png" };

    // 加载图像
    std::vector< Mat > images;
    for ( const auto& path : paths )
    {
        Mat img = imread( path );
        if ( img.empty() )
        {
            std::cerr << "无法加载图像: " << path << std::endl;
            return -1;
        }
        images.push_back( img );
    }

    // 初始化特征检测器和描述符提取器
    Ptr< Feature2D > detector = ORB::create();
    std::vector< std::vector< KeyPoint > > keypoints( images.size() );
    std::vector< Mat > descriptors( images.size() );

    // 检测关键点并计算描述符
    for ( size_t i = 0; i < images.size(); ++i )
    {
        detector->detectAndCompute( images[ i ], noArray(), keypoints[ i ], descriptors[ i ] );
    }

    // 匹配描述符
    std::vector< MatchesInfo > pairwise_matches;
    BFMatcher matcher( NORM_HAMMING );
    for ( size_t i = 0; i < images.size(); ++i )
    {
        for ( size_t j = i + 1; j < images.size(); ++j )
        {
            std::vector< DMatch > matches;
            matcher.match( descriptors[ i ], descriptors[ j ], matches );

            MatchesInfo mi;
            mi.src_img_idx = static_cast< int >( i );
            mi.dst_img_idx = static_cast< int >( j );
            mi.matches     = matches;
            // 假设这里我们简单地设置了置信度为1.0f,实际应用中应根据实际情况设置
            mi.confidence = 1.0f;
            pairwise_matches.push_back( mi );
        }
    }

    // 设置置信度阈值
    float conf_threshold = 1.0f;

    try
    {
        // 调用matchesGraphAsString函数
        String matches_graph_string = matchesGraphAsString( paths, pairwise_matches, conf_threshold );
        std::cout << "Matches Graph:\n" << matches_graph_string << std::endl;
    }
    catch ( const std::exception& e )
    {
        std::cerr << "运行时错误: " << e.what() << std::endl;
        return -1;
    }

    return 0;
}

运行结果

bash 复制代码
Matches Graph:
graph matches_graph{
"stich1.png";
"stich2.png";
}
相关推荐
飞哥数智坊5 小时前
GPT-5-Codex 发布,Codex 正在取代 Claude
人工智能·ai编程
倔强青铜三5 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
虫无涯6 小时前
Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
人工智能
Dm_dotnet8 小时前
公益站Agent Router注册送200刀额度竟然是真的
人工智能
算家计算8 小时前
7B参数拿下30个世界第一!Hunyuan-MT-7B本地部署教程:腾讯混元开源业界首个翻译集成模型
人工智能·开源
机器之心9 小时前
LLM开源2.0大洗牌:60个出局,39个上桌,AI Coding疯魔,TensorFlow已死
人工智能·openai
Juchecar10 小时前
交叉熵:深度学习中最常用的损失函数
人工智能
林木森ai10 小时前
爆款AI动物运动会视频,用Coze(扣子)一键搞定全流程(附保姆级拆解)
人工智能·aigc
聚客AI10 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
BeerBear12 小时前
【保姆级教程-从0开始开发MCP服务器】一、MCP学习压根没有你想象得那么难!.md
人工智能·mcp