OpenCV相机标定与3D重建(47)从两幅图像中的一组匹配点恢复相机的姿态(旋转和平移)函数recoverPose()的使用

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

算法描述

从两幅不同相机拍摄的图像中对应的点恢复相对相机旋转和平移,使用手性检查。返回通过该检查的内点数量。
cv::recoverPose 是 OpenCV 库中的一个函数,用于从两幅图像中的一组匹配点恢复相机的姿态(旋转和平移)。它还可以计算本质矩阵(Essential Matrix)或基础矩阵(Fundamental Matrix),具体取决于提供的相机内参矩阵。

函数原型

int cv::recoverPose	
(
	InputArray 	points1,
	InputArray 	points2,
	InputArray 	cameraMatrix1,
	InputArray 	distCoeffs1,
	InputArray 	cameraMatrix2,
	InputArray 	distCoeffs2,
	OutputArray 	E,
	OutputArray 	R,
	OutputArray 	t,
	int 	method = cv::RANSAC,
	double 	prob = 0.999,
	double 	threshold = 1.0,
	InputOutputArray 	mask = noArray() 
)		

参数

  • 参数points1:来自第一幅图像的N个2D点数组。点坐标应该是浮点数(单精度或双精度)。
  • 参数points2:与 points1 大小和格式相同的第二幅图像的点数组。
  • 参数cameraMatrix1:第一相机的输入/输出相机矩阵,同 calibrateCamera 中的定义。此外,对于立体情况,可以使用额外的标志位,详见下文。
  • 参数distCoeffs1:第一相机的输入/输出畸变系数向量,同 calibrateCamera 中的定义。
  • 参数cameraMatrix2:第二相机的输入/输出相机矩阵,同 calibrateCamera 中的定义。此外,对于立体情况,可以使用额外的标志位,详见下文。
  • 参数distCoeffs2:第二相机的输入/输出畸变系数向量,同 calibrateCamera 中的定义。
  • 参数E:输出的本质矩阵。
  • 参数R:输出的旋转矩阵。与平移向量一起,该矩阵组成一个从第一个相机坐标系到第二个相机坐标系的基变换元组。注意,通常情况下,t 不能直接用于此元组,详见下面描述的参数。
  • 参数t:输出的平移向量。这个向量是通过 decomposeEssentialMat 得到的,因此只知道其方向且具有单位长度。
  • 参数method:计算本质矩阵的方法。
    • RANSAC:用于RANSAC算法。
    • LMEDS:用于LMedS算法。
  • 参数prob:仅用于RANSAC或LMedS方法的参数。它指定了估计矩阵正确的期望置信水平(概率)。
  • 参数threshold:仅用于RANSAC的参数。它是点到极线的最大距离(以像素为单位),超过此距离的点被视为离群点,并不用于计算最终的基本矩阵。可以根据点定位的准确性、图像分辨率和图像噪声设置为大约1-3。
  • 参数mask:points1 和 points2 中内点的输入/输出掩码。如果它不是空的,则它标记了给定本质矩阵 E 下 points1 和 points2 的内点。只有这些内点将被用来恢复姿态。在输出掩码中,只有通过手性检查的内点会被保留。

函数描述
此函数使用 decomposeEssentialMat 分解本质矩阵,然后通过手性检查验证可能的姿态假设。手性检查意味着三角化的3D点应具有正深度。一些细节可以在文献 [204] 中找到。

此函数可用于处理 findEssentialMat 输出的 E 和 mask。在这种情况下,points1 和 points2 是 findEssentialMat 的相同输入。

// Example. Estimation of fundamental matrix using the RANSAC algorithm
int point_count = 100;
vector<Point2f> points1(point_count);
vector<Point2f> points2(point_count);
// initialize the points here ...
for( int i = 0; i < point_count; i++ )
{
    points1[i] = ...;
    points2[i] = ...;
}
// Input: camera calibration of both cameras, for example using intrinsic chessboard calibration.
Mat cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2;
// Output: Essential matrix, relative rotation and relative translation.
Mat E, R, t, mask;
recoverPose(points1, points2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, E, R, t, mask);

返回值

该函数返回内点的数量,即符合估计模型的点对数目。

注意事项

如果 cameraMatrix2 和 distCoeffs2 没有提供,则假设它们与 cameraMatrix1 和 distCoeffs1 相同。
当提供了有效的 mask 参数时,函数将更新这个掩码以反映最终确定的内点。

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    // 定义两组2D点 (这里仅作为示例,实际应用中这些点应该来自图像特征匹配)
    vector<Point2f> points1 = { /* ... */ };
    vector<Point2f> points2 = { /* ... */ };

    // 相机内参矩阵和畸变系数 (假设已知)
    Mat cameraMatrix1 = (Mat_<double>(3, 3) << fx, 0, cx, 0, fy, cy, 0, 0, 1);
    Mat distCoeffs1 = Mat::zeros(5, 1, CV_64F);

    // 输出变量
    Mat E, R, t;
    Mat mask; // 内点掩码

    // 执行姿态恢复
    int inliers = recoverPose(points1, points2, cameraMatrix1, distCoeffs1,
                              cameraMatrix1, distCoeffs1, E, R, t, mask);

    // 打印结果
    cout << "Number of inliers: " << inliers << endl;
    cout << "Rotation matrix:\n" << R << endl;
    cout << "Translation vector:\n" << t << endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第31天:Web开发-PHP应用TP框架MVC模型路由访问模版渲染安全写法版本漏洞

#知识点 1、安全开发-框架技术-ThinkPHP 2、安全开发-框架安全-版本&写法 3、安全开发-ThinkPHP-代码审计案例 类别 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适…

量子计算遇上人工智能:突破算力瓶颈的关键?

引言&#xff1a;量子计算遇上人工智能——突破算力瓶颈的关键&#xff1f; 在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活&#xff0c;从语音助手到自动驾驶&#xff0c;从医学诊断到金融分析&#xff0c;无不彰显其…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

homework 2025.01.07 math 6

1选择部分 二填空部分

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…

基于Springboot + vue实现的小型养老院管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t

IDEA中Maven依赖包导入失败报红的潜在原因

在上网试了别人的八个问题总结之后依然没有解决&#xff1a; IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因&#xff1a;<dep…

UVM:uvm_component methods configure

topic UVM component base class uvm_config_db 建议使用uvm_config_db代替uvm_resource_db uvm factory sv interface 建议&#xff1a;uvm_config_db 以下了解 建议打印error

基于时间维度水平拆分的多 TiDB 集群统一数据路由/联邦查询技术的实践

导读 在大数据时代&#xff0c;金融行业面临着日益增长的数据量和复杂的查询需求&#xff0c;尤其是跨库、跨集群的场景。在这种背景下&#xff0c;如何在保证数据一致性、高可用性的同时&#xff0c;实现业务的快速扩展与高效查询&#xff0c;成为了企业数字化转型的关键挑战…

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 加法公式 减法 条件概率公式 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续…

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件&#xff0c;第三方通过npm依赖安装使用&#xff1b;使用最近公司接了一个项目&#xff0c;这个项目需要集成到第三方页面&#xff0c;在第三方页面点击项目名称&#xff0c;页面变成我们的项目页面&#xff1b;要求以npm库文件提供给他们&#xff1b;…

《空舞的巨兽》官方学习版

一个以被遗忘之地为背景的原创故事&#xff0c;这是一个充满悲剧的没落王国。扮演外地战士雷恩猎人&#xff08;玩家&#xff09;&#xff0c;踏上危险的任务&#xff0c;结束困扰你自己和村庄的诅咒。你唯一的希望就是杀死不可杀死的可怕巨兽。 《空舞的巨兽》官方版 https:/…

go-zero框架快速入门

文章目录 go-zero 简介安装goctl安装go-zero启动go-zero API语言定义结构体API定义路由API格式化对齐 生成代码生成基本逻辑代码生成数据库model文件 go-zero 简介 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性&#xff0c;经…

切忌 SELECT *,就算表只有一列

原文地址 尽量避免 SELECT *&#xff0c;即使在单列表上也是如此 – 如果你现在不同意这一点&#xff0c;读完这篇文章&#xff0c;你可能就要动摇了。 2012年的一个故事 这是我 12 年前&#xff08;约 2012-2013 年&#xff09;在客户后台应用程序中遇到的一个真实故事。 当…