当前位置: 首页 > article >正文

OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator

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

算法描述

基于仿射变换的估计器。
这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。

cv::detail::AffineBasedEstimator 是 OpenCV 库中用于估计图像间仿射变换关系的类。仿射变换是一种二维坐标到二维坐标之间的线性映射,它保持了直线和平行线的性质,但允许旋转、平移、缩放和倾斜。

此类通常在图像拼接、特征匹配后处理等任务中使用,用来精确计算两张或多张图像间的相对位置关系。仿射变换可以通过三对点(每个图像中各三点)来唯一确定,因此该类可能要求用户提供至少三对匹配点以进行变换矩阵的估算。

基本用法

  • 创建对象:首先,需要创建 cv::detail::AffineBasedEstimator 类的一个实例。
  • 准备数据:准备好你想要用来估计仿射变换的数据,这通常是一系列匹配好的关键点对。
  • 调用估算方法:调用类的方法来执行估算。具体方法名可能根据版本有所不同,但通常会有一个类似 estimate() 的函数,接受输入的关键点对,并返回一个表示仿射变换的矩阵。
  • 应用变换:得到的仿射变换矩阵可以应用于图像上,例如通过 cv::warpAffine 函数将一张图片转换到另一张图片的坐标系下。

主要成员函数

  • 构造函数
    AffineBasedEstimator()
    默认构造函数,初始化 AffineBasedEstimator 对象。

  • estimate 函数
    bool estimate(const std::vector& features, const std::vector& pairwise_matches, std::vectorcv::UMat& cameras)
    该函数使用由匹配器提供的成对变换信息来估计每个相机(即每张图片)的最终仿射变换矩阵。

    参数:

    • features: 包含每张图片的关键点和描述符信息的 ImageFeatures 结构体列表。
    • pairwise_matches: 包含每对图片之间的匹配信息的 MatchesInfo 结构体列表。
    • cameras: 输出参数,包含估计得到的每个相机的变换矩阵(通常是仿射变换矩阵)。

代码示例

#include <opencv2/opencv.hpp>#include <opencv2/stitching/detail/matchers.hpp>
#include <vector>using namespace cv;
using namespace cv::detail;
using namespace std;int main()
{Mat img1 = imread("/media/dingxin/data/study/OpenCV/sources/images/stich1.png", IMREAD_GRAYSCALE);Mat img2 = imread("/media/dingxin/data/study/OpenCV/sources/images/stich2.png", IMREAD_GRAYSCALE);if (img1.empty() || img2.empty()) {cerr << "无法读取图像文件" << endl;return -1;}// 初始化特征检测器和描述符提取器Ptr< Feature2D > detector        = ORB::create( 500 );  // 提取500个关键点Ptr< DescriptorMatcher > matcher = DescriptorMatcher::create( "BruteForce-Hamming" );// 检测特征点并计算描述符vector< KeyPoint > keypoints1, keypoints2;Mat descriptors1, descriptors2;detector->detectAndCompute( img1, noArray(), keypoints1, descriptors1 );detector->detectAndCompute( img2, noArray(), keypoints2, descriptors2 );// 匹配描述符vector< DMatch > matches;matcher->match( descriptors1, descriptors2, matches );// 过滤匹配结果(可选)vector< Point2f > points1, points2;for ( size_t i = 0; i < matches.size(); i++ ){points1.push_back( keypoints1[ matches[ i ].queryIdx ].pt );points2.push_back( keypoints2[ matches[ i ].trainIdx ].pt );}// 使用RANSAC算法估计仿射变换Mat inliers_mask;Mat affine_matrix = estimateAffinePartial2D( points1, points2, inliers_mask );cout << "Affine Matrix: \n" << affine_matrix << endl;// 绘制匹配结果(仅显示内点)vector< DMatch > good_matches;for ( int i = 0; i < inliers_mask.rows; ++i ){if ( inliers_mask.at< uchar >( i ) ){good_matches.push_back( matches[ i ] );}}Mat img_matches;drawMatches( img1, keypoints1, img2, keypoints2, good_matches, img_matches );imshow( "Good Matches & Affine Transform", img_matches );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…...

PyCharm的终端(terminal)中进入指定conda虚拟环境

参考这篇博文&#xff1a; PyCharm的终端&#xff08;terminal&#xff09;中进入指定conda虚拟环境_pycharm配置conda终端-CSDN博客...

高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?

如果有遗漏,评论区告诉我进行补充 面试官: Eureka在微服务架构中的角色? 我回答: 在微服务架构中&#xff0c;Eureka作为Netflix开源的服务发现组件&#xff0c;在解决服务间通信的寻址问题方面扮演着至关重要的角色。以下是结合提供的内容对Eureka在微服务架构中的角色进行…...

c++类和对象(下篇)下

下面就来补充一下c雷和对象最后一点内容. 首先先补充一下上一篇博客上c类和对象(下篇)上-CSDN博客最后学习的静态成员变量的小练习求123...n_牛客题霸_牛客网 (nowcoder.com)下面就是题解.灵活的运用了静态成员变量不销毁的特点,建立数组利用构造函数来完成n次相加. class A{ …...

HTTP 失败重试(重发)方案

在 Qt 网络开发中&#xff0c;使用 QNetworkAccessManager 进行 HTTP 请求时&#xff0c;可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性&#xff0c;可以实现 HTTP 失败重试&#xff08;重发&#xff09; 机制。下面介绍几种常见的 失败重发方案&#xff1a; 单…...

使用WebDAV将文件传输到实时(RT)目标 转发

如何配置Web分布式创作和版本控制&#xff08;WebDAV&#xff09;服务器并使用它来与我的实时(RT)目标之间传输文件&#xff1f; 在目标上安装 WebDAV 和 SSL 支持 NI Linux Real-Time 您无需完成任何安装 WebDAV 和 SSL 支持的步骤。默认情况下&#xff0c;这些组件在NI Linu…...

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取

Web爬虫利器FireCrawl&#xff1a;全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成&#xff08;RAG&#xff09;&#xff1a;3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…...

如何避免PRD(需求文档)成为“沟通黑洞”

在撰写PRD&#xff08;需求文档&#xff09;时&#xff0c;要避免成为“沟通黑洞”&#xff0c;必须聚焦目标清晰、需求拆解、协同评审、持续迭代等关键点。其中&#xff0c;协同评审尤其重要——通过在文档完成初期就邀请相关部门共同审阅讨论&#xff0c;可以及早发现需求逻辑…...

c++基础知识--返回值优化

在 C 中&#xff0c;Named Return Value Optimization&#xff08;NRVO&#xff0c;具名返回值优化&#xff09; 是一种编译器优化技术&#xff0c;用于消除函数返回一个局部对象时的拷贝或移动操作。它是 返回值优化&#xff08;RVO&#xff09; 的一种更复杂的变体&#xff0…...

go面向对象编程三大特性,封装、继承和多态

1.简介 go具有面向对象编程的封装、继承和多态的特性,只是实现的方式和其它OOP语言不一样,下面看下go的三大特性是如何实现的。 2.封装 2.1基本介绍 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的操作(方法),才能…...

巧用符号链接搬移C盘中的软件数据目录到其他盘

#工作记录 我们知道&#xff0c;在Windows11系统&#xff0c;有些软件是不能指定安装目录的&#xff0c;有些软件即使指定了安装目录可是在更新版本之后还是会安装到默认的C盘目录中&#xff08;比如剪映&#xff09;&#xff0c;而且每次安装某些软件之后&#xff0c;这些软件…...

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化 家庭自动化一直是我们大多数人的灵感来源。从我们舒适的椅子或任何房间的床上切换交流负载,而无需伸手去触碰另一个房间的开关,听起来很酷,不是吗!.现在,在物联网时代,多亏了 ESP8266 模块,它使从世界…...

高性能Java并发编程:线程池与异步编程最佳实践

Future模式与CompletableFuture 处理异步任务时&#xff0c;Future与CompletableFuture是强有力的工具。 实战案例&#xff1a;多API并行调用 假设我们需要从多个微服务获取数据&#xff0c;然后合并结果&#xff1a; public UserProfileDto getUserProfile(Long userId) {…...

【Java篇】一气化三清:类的实例化与封装的智慧之道

文章目录 类和对象&#xff08;中&#xff09;五、对象的构造及初始化5.1 如何初始化对象5.2 构造方法5.2.1 构造方法的概念5.2.2 构造方法的特性 5.3 默认初始化5.4 就地初始化 六、封装6.1 封装的概念6.2 访问限定符6.3 封装扩展之包6.3.1 包的概念6.3.3导入包6.3.3全类名6.3…...

VMware上调整centos终端的背景颜色

目录 1. 正常打开一个终端&#xff0c;背景颜色默认为白色 2. 在打开的终端页面上右击&#xff0c;选择“配置文件首选项” 3. 取消默认勾选的 “使用系统主题中的颜色” 即可 1. 正常打开一个终端&#xff0c;背景颜色默认为白色 2. 在打开的终端页面上右击&#xff0c;选择…...

Netty源码—1.服务端启动流程二

大纲 1.服务端启动整体流程及关键方法 2.服务端启动的核心步骤 3.创建服务端Channel的源码 4.初始化服务端Channel的源码 5.注册服务端Channel的源码 6.绑定服务端端口的源码 7.服务端启动流程源码总结 5.注册服务端Channel的源码 (1)注册服务端Channel的入口 (2)注册…...

Latex2024安装教程(附安装包)Latex2024详细图文安装教程

文章目录 前言一、Latex2024下载二、Texlive 2024安装教程1.准备安装文件2.启动安装程序3.配置安装选项4.开始安装5.安装完成6.TeX Live 2024 安装后确认 三、Texstudio 安装教程1.准备 Texstudio 安装2.启动 Texstudio 安装向导3.选择安装位置4.等待安装完成5.启动 Texstudio6…...

用了Cline和华为云的大模型,再也回不去了

这两年AI火热&#xff0c;受影响最大的还是程序员群体&#xff0c;因为编程语言是高度形式化的&#xff0c;完全可以用BNF等形式精确地定义&#xff0c;不像自然语言那样&#xff0c;容易出现歧义。另外开源是软件界的潮流&#xff0c;GitHub上有海量的开源代码可供AI来训练&am…...

解码软件需求的三个维度:从满足基础到创造惊喜

在软件开发的世界里&#xff0c;用户需求就像一张复杂的地图&#xff0c;指引着产品前进的方向。但并非所有需求都能带来同样的价值——有些是产品生存的“氧气”&#xff0c;有些是吸引用户的“磁石”&#xff0c;还有一些则是让人眼前一亮的“魔法”。如何区分它们&#xff1…...

<table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。

实现 <table> 内第一行高度设定为 60px&#xff0c;第二行和右侧元素高度补齐的效果&#xff0c;你可以通过 CSS 样式来控制。示例&#xff1a; 为第一行 <tr> 设置固定高度 60px。对于右侧元素&#xff0c;假设它是一个 <div> 或者其他容器&#xff0c;将其…...

详细解析格式化消息框的代码

书籍&#xff1a;《windows程序设计(第五版)》的开始 环境&#xff1a;visual studio 2022 内容&#xff1a;格式化消息框 说明&#xff1a;以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数&#xff0c;通过va_list机制&#xff0c…...

过往记录系列 篇四:年报月行情历史梳理

文章目录 系列文章市场整体走势板块表现资金面与成交量市场风格系列文章 过往记录系列 篇一:牛市板块轮动顺序梳理 过往记录系列 篇二:新年1月份(至春节前)行情历史梳理 过往记录系列 篇三:春节行情历史梳理 市场整体走势 整体趋势:震荡分化,先扬后抑 上涨概率约40%:…...

Jetson Nano 三个版本(B01 4GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评

Jetson Nano三个版本&#xff08;B01 GB、Orin 4GB、Orin 8GB&#xff09;本地部署Deepseek等大模型的测评 一、为什么要在终端设备部署大模型&#xff1f;二、 Jetson Nano推理大模型时计算资源占用情况分析为什么测试Jetson Nano?三款Jetson Nano芯片简介 三、大模型推理实验…...

基于Netty实现高性能HTTP服务的架构解析

一、HTTP协议基础 1.1 HTTP协议概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;作为现代Web应用的基石&#xff0c;是基于TCP/IP的应用层协议&#xff0c;具有以下核心特性&#xff1a; 请求/响应模型&#xff1a;客户端发起请求&#xff0c;服务端返回响应无…...

mac calDAV 日历交互

安装Bakal docker https://sabre.io/dav/building-a-caldav-client/ 在Bakal服务器上注册账户 http://localhost:8080/admin/?/users/calendars/user/1/ 在日历端登录账户&#xff1a; Server: http://127.0.0.1:8080/dav.php Server Path: /dav.php/principals/lion No e…...

【面试问题】Java 接口与抽象类的区别

引言 在 Java 面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象类&#xff08;Abstract Class&#xff09;是两个重要的抽象工具。它们都能定义未实现的方法&#xff0c;但设计目标和使用场景截然不同。本文将通过语法、特性和实际案例&#xff0c;深入…...

centos【rockylinux】安装【supervisor】的注意事项【完整版】

重新加载 systemd 配置推荐使用pip的方式安装 pip install supervisor 第二步&#xff1a;添加supervisord.conf配置文件 [unix_http_server] file/tmp/supervisor.sock ; UNIX socket 文件&#xff0c;supervisorctl 会使用 ;chmod0700 ; socket 文件的…...

数据库监控:确保业务连续性和用户体验

在数字化时代&#xff0c;数据库作为企业的数据心脏&#xff0c;其重要性不言而喻。无论是交易系统、客户关系管理系统&#xff0c;还是数据分析平台&#xff0c;都离不开数据库的支撑。然而&#xff0c;数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…...

Deflate和Gzip压缩在HTTP响应中的作用与实现

1. 引言 HTTP响应压缩是一种优化技术,用于减少传输的数据量,从而提高网页加载速度和带宽利用率。Deflate和Gzip是两种常用的压缩算法,广泛应用于HTTP协议中。 2. Deflate与Gzip概述 2.1 Deflate算法简介 Deflate是一种无损数据压缩算法,结合了LZ77算法和哈夫曼编码。它…...

PointVLA:将 3D 世界注入视觉-语言-动作模型

25年3月来自美的集团、上海大学和华东师大的论文“PointVLA: Injecting the 3D World into Vision-Language-Action Models”。 视觉-语言-动作 (VLA) 模型利用大规模 2D 视觉语言预训练&#xff0c;在机器人任务方面表现出色&#xff0c;但它们对 RGB 图像的依赖&#xff0c;…...