OpenCV相机标定与3D重建(20)将单应性矩阵分解为旋转矩阵、平移向量和法向量函数decomposeHomographyMat()的使用

news2024/12/15 10:58:07
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

将单应性矩阵分解为旋转矩阵、平移向量和法向量。
cv::decomposeHomographyMat 是 OpenCV 库中的一个函数,用于将单应性矩阵(Homography Matrix)分解为旋转矩阵(Rotation Matrices)、平移向量(Translation Vectors)和法向量(Normals)。该函数能够从给定的单应性矩阵中提取出多个可能的解,这些解描述了平面在两个不同视角之间的相对运动。

函数原型


int cv::decomposeHomographyMat	
(
	InputArray 	H,
	InputArray 	K,
	OutputArrayOfArrays 	rotations,
	OutputArrayOfArrays 	translations,
	OutputArrayOfArrays 	normals 
)	

参数

  • 参数H:两个图像之间的输入单应性矩阵。
  • 参数K:输入的相机内参矩阵。
  • 参数rotations:旋转矩阵数组。
  • 参数translations:平移向量数组(注意,这里应该是“平移向量”而非“平移矩阵”)。
  • 参数normals:平面法向量数组。

此函数提取平面物体在两个视图之间的相对相机运动,并返回最多四个由旋转、平移和平面法向量组成的数学解元组。单应性矩阵 H 的分解在文献 [176] 中有详细描述。

如果由平面诱导的单应性矩阵 H 给出了约束
[ x i ′ y i ′ 1 ] ∼ H [ x i y i 1 ] \begin{bmatrix} x'_i \\ y'_i \\ 1 \end{bmatrix} \sim H \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix} xiyi1 H xiyi1

其中 H 是单应性矩阵,那么旋转数组 rotations[k] 和平移数组 translations[k] 组成的元组是从源相机坐标系到目标相机坐标系的基变换。然而,通过分解 H,只能获得由场景深度(通常是未知的)归一化的平移,即其方向但长度是归一化的。

如果有点对应关系可用,通过应用正深度约束(即所有点必须位于相机前方),至少可以排除两个解。

代码示例


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

int main()
{
    // 假设我们已经得到了单应性矩阵 H 和相机内参矩阵 K
    cv::Mat H = ( cv::Mat_< double >( 3, 3 ) << 0.998, -0.062, 50, 0.062, 0.998, 100, 0.007, 0.05, 1 );

    cv::Mat K = ( cv::Mat_< double >( 3, 3 ) << 500, 0, 320, 0, 500, 240, 0, 0, 1 );

    // 创建输出容器
    std::vector< cv::Mat > rotations;
    std::vector< cv::Mat > translations;
    std::vector< cv::Mat > normals;

    // 分解单应性矩阵
    int numSolutions = cv::decomposeHomographyMat( H, K, rotations, translations, normals );

    // 打印结果
    std::cout << "Number of solutions: " << numSolutions << "\n";

    for ( int i = 0; i < numSolutions; ++i )
    {
        std::cout << "Solution " << i + 1 << ":\n";
        std::cout << "Rotation Matrix:\n" << rotations[ i ] << "\n";
        std::cout << "Translation Vector:\n" << translations[ i ] << "\n";
        std::cout << "Normal Vector:\n" << normals[ i ] << "\n";
    }

    return 0;
}

运行结果

Number of solutions: 4
Solution 1:
Rotation Matrix:
[-0.9802608247288047, 0.1889271965254338, 0.05826860145100454;
 0.1697517542892211, 0.6531756122806627, 0.7379335752195324;
 0.101356092158646, 0.7332585723559504, -0.6723531874309145]
Translation Vector:
[18.39045228566228;
 11.99059679500396;
 -29.81341238180146]
Normal Vector:
[0.1208936041858721;
 0.8638372310213145;
 0.4890500738864864]
Solution 2:
Rotation Matrix:
[-0.9802608247288047, 0.1889271965254338, 0.05826860145100454;
 0.1697517542892211, 0.6531756122806627, 0.7379335752195324;
 0.101356092158646, 0.7332585723559504, -0.6723531874309145]
Translation Vector:
[-18.39045228566228;
 -11.99059679500396;
 29.81341238180146]
Normal Vector:
[-0.1208936041858721;
 -0.8638372310213145;
 -0.4890500738864864]
Solution 3:
Rotation Matrix:
[-0.4626383896883119, 0.5400507693070011, -0.7030724620958111;
 0.3419971927832055, -0.6229459442112031, -0.7035455001054416;
 -0.8179264273239335, -0.5659359656001044, 0.1035028614299165]
Translation Vector:
[18.42326185348789;
 13.79683557680836;
 -29.00092162954408]
Normal Vector:
[0.09258217344711696;
 0.8432401346969438;
 0.5295041231152859]
Solution 4:
Rotation Matrix:
[-0.4626383896883119, 0.5400507693070011, -0.7030724620958111;
 0.3419971927832055, -0.6229459442112031, -0.7035455001054416;
 -0.8179264273239335, -0.5659359656001044, 0.1035028614299165]
Translation Vector:
[-18.42326185348789;
 -13.79683557680836;
 29.00092162954408]
Normal Vector:
[-0.09258217344711696;
 -0.8432401346969438;
 -0.5295041231152859]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Tomcat】第二站:Tomcat通过反射机制运行项目

目录 前言 1. 动态资源&静态资源 1.1 为什么要区分&#xff1f; 1.2 静态资源 1.3 动态资源 1.4 如何判断 2. Tomcat优先动态 2.1 原因 3. Tomcat运行项目的流程 前言 我们在写项目时&#xff0c;在进行前后端交互时&#xff0c;都会创建一个servlet&#xff0c;然…

vue canvas 绘制选定区域 矩形框

客户那边文档相当的多&#xff0c;目前需要协助其将文档转为数据写入数据库&#xff0c;并与其他系统进行数据共享及建设&#xff0c;所以不得不搞一个识别的功能&#xff0c;用户上传PDF文档后&#xff0c;对于关键信息点进行识别入库&#xff01; 以下为核心代码&#xff0c…

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用&#xff08;一&#xff09;精准定位元素&#xff08;二&#xff09;应对动态网页&#xff08;三&#xff09;数据结构化提取 二、Xpath 的常用方法&#xff08;一&#xff09;节点选取&#xff08;二&#xff09;谓词筛选&#xff0…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

java抽奖系统登录下(四)

6.4 关于登录 最简单的登录&#xff1a; 1、web登录页填写登录信息&#xff0c;前端发送登录信息到后端&#xff1b; 2、后端接受登录信息&#xff0c;并校验。校验成功&#xff0c;返回成功结果。 这种登录会出现一个问题&#xff0c;用户1成功登录之后&#xff0c;获取到后台…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

AI 智能体(AI Agent)到底什么原理?能干什么事情

智能体应用有哪些&#xff1f; 智能体在千行百业中有着广泛的应用&#xff0c;目前已经在 600 多个项目落地和探索&#xff0c;广泛应用于政府与公共事业、交通、工业、能源、金融、医疗、科研等行业。智能体是模拟人类智能的计算机系统&#xff0c;能自主感知环境、智能决策并…

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

智慧政务数据中台建设及运营解决方案

数据中台&#xff1a;政府数字化转型的引擎 数据中台作为政府数字化转型的核心驱动力&#xff0c;起源于美军的作战体系&#xff0c;强调高效、灵活与强大。它不仅促进了政府决策的科学性&#xff0c;还推动了政府服务的精细化与智能化。 数据中台的应用场景&#xff1a;数字…

如何使mysql数据库ID从0开始编号——以BiCorpus为例

BiCorpus是北京语言大学韩林涛老师研制一款在线语料库网站&#xff0c;可以通过上传tmx文件&#xff0c;实现在线检索功能&#xff0c;程序在github上开源免费&#xff0c;深受广大网友的喜欢。 在使用过程中&#xff0c;我发现我上传的语言资产经历修改后&#xff0c;mysql的…

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始&#xff0c;一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型&#xff0c;如果数值超出了 int 的范围&#xff0c;就会发生溢出错误。为了避免这个问题&#xff0c;可以将数字表示为 long 类型&#xff0c;方法…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…

minio 分布式文件管理

一、minio 是什么&#xff1f; MinIO构建分布式文件系统&#xff0c;MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数…

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用&#xff1f;华为FreeBuds Pro 4有星闪精确查找和离线查找&#xff0c;离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能&#xff0c;当前仅华为FreeBuds Pro 4充电盒支持…

深度学习:基于MindSpore的极简风大模型微调

什么是PEFT&#xff1f;What is PEFT&#xff1f; PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结&#xff0c;只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…

【一本通】最小圈

【一本通】最小圈 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于一张有向图&#xff0c;要你求图中最小圈的平均值最小是多少&#xff0c;即若一个圈经过k个节点&#xff0c;那么一个圈的平均值为圈上k条边权的和除以k&#xff0c;现要…

ansible自动化运维(四)jinjia2模板

Jinjia2模板 前面说到playbook组成的时候&#xff0c;有介绍到template模块&#xff0c;而template模块对模板文件进行渲染时&#xff0c;使用的就是jinja2模板引擎&#xff0c;jinja2本身就是基于python的模板引擎&#xff0c;所以下面先来了解一下jinjia2模板的一些用法 基…