理解全景图像拼接

1 3D到2D透视投影

    三维空间上点  p 投影到二维空间 q 有两种方式:1)正交投影,2)透视投影。

    正交投影直接舍去 z 轴信息,该模型仅在远心镜头上是合理的,或者对于物体深度远小于其到摄像机距离时的近似模型。

    常规镜头成像可以使用透视投影建模,如下图:

      

    三维空间点 p=(X,Y,Z) 投影到二维空间点 q = (x,y),镜头光轴在 Z 轴上,满足关系 

    真实的物理模型将 X 投影到 x, 但使用 

 可以避免关系式中产生一个负号,因此投影点可写为 

, 同理,有 

    使用矩阵可表示为 

,变换结果 

 为齐次坐标,

    以上变换举证前三列可表达相机自身相关性质,被称为内参,比如 

,其中, f 表示相机焦距,af表示像元横纵比(一般情形下为 1),

    cx,cy 表示 CCD 中心与光轴间平移距离,s 表示了 CCD 法向量与光轴不平行程度。

    在实际应用中,一般会使用简单模型 

,该模型仅表达了焦距与CCD中心平移。

    如果将以上变换矩阵改写成满秩矩阵,那么其逆变换就变得很简单,使用 4*4 变换矩阵重新构造透视投影如下:

     

,

    改写齐次坐标 

,前两个分量表示图像上坐标值,第四个分量表示深度信息。

    以上透视投影模型要求三维空间坐标满足以下条件:

    1)以镜头光心(小孔成像中的小孔)为原点;

    2)Z轴垂直与 CCD 平面;

    3)XY轴与 CCD 平面 xy 轴平行;

    但在实际三维坐标系可能是任意建立的,所以在透视投影前需要变换坐标系,使用平移+旋转模型如下:

    

,其中,R 为 3*3 旋转矩阵,t 为平移向量。

    综上,任意三维空间上点到二维平面的透视投影可表示为 

2 成对图像配准

       

    如上图(a)所示,三维空间上点 p 映射到图像平面为 

,由于 

 均为满足矩阵,故其逆矩阵一定存在,有 

    结合 

 可建立 

 与 

 之间的关系为 

    以上关系需要相机记录成像点深度信息,一般相机无法记录深度信息,因此,可以使用图像 (b)建立关系:

    假设所有三维空间上点均在一个空间平面上,即满足 

    当进行投影变换时,其深度信息为零, 具体可表达为  

    观察可知,删除变换矩阵最后一行与最后一列不影响计算结果,因此,可简化表达式为 

    以上变换有 8 个自由度,将变换矩阵重新改写为 

    变换矩阵 

 表达了平面场景的映射关系,这正好是 “图像配准” 一文中使用的模型之一。

3 旋转全景模型

    在一个固定的世界坐标下,假设相机绕某旋转点旋转拍照,两次(或多次)拍照间相机坐标原点保持不变,但光轴随旋转发生改变。

    三维空间中任意固定点在每次拍照中的映射可表达为:

    1)建立相机坐标系(原点与世界坐标系一致,光轴为相机当前光轴);

    2)使用旋转矩阵 R 将世界坐标系下点旋转为相机坐标系下点;

    3)使用投影矩阵投影到相机平面;

    因此,三维空间点在两幅图像中的映射关系可简化为 

    假设 K 仅包含相机焦距信息,则 

    

,当焦距已知时,此参数仅为旋转,当焦距未知时,可以是固定焦距或者变化焦距。

    一般情况下,该变化的参数个数为 4,包括 1)固定未知焦距,2)旋转参数(3个),

    这比8个参数投影变换更加简化,该模型是用于全景图像拼接的理想模型。

4 迭代求解

    给定一对图像上若干匹配点 

,使用平面投影变换可得 

    两边同时乘以分母得 

    进一步整理为 

    使用该线性方程组可以求解变换矩阵 

 的初始估计。

    在初始估计 

 基础上使用非线性迭代方程为 

,

    

    

 为变换矩阵 

 的估计,

 为第二次迭代估计,通过最小化第二次估计误差即求得合理的 

    如果在每次迭代估计中使用上次迭代估计值 

 作为初始估计,即 

 中各个参数值均为零,迭代方程可改写为

    

    注意,以上 

 不再是初始匹配点,而是每次迭代后的计算点!!!

    在旋转全景模型中,

,当旋转分量增加 

 后,

    旋转矩阵为  

,  

 为增量矩阵。

    

,当  

 为弧度单位且很小时,

    

 表示旋转轴。

    增量矩阵 D 可改写为 

    D 中变量为旋转角度 

 ,使用线性近似可表达为 

    其中,

 为初始估计参数的变换结果,

 为旋转一个小的角度 

 后的线性变换结果,

    使用最小二乘法可以求解一个合理的旋转角度。

    观察增量矩阵 D,可以发现 D 与 H 存在一种对应关系 

    迭代公式 

 可转换为:

     

    整理公式,使其为 

 的线性函数 

    使用最小二乘法可以求解一个合理的旋转角度。

    以上迭代公式中,

 是一个未知量,但是可以从初始估计 

 中计算得出,具体如下:

    

   

    

,该旋转矩阵为正交矩阵,

    在旋转矩阵每一项上乘以一个因子 

 不会改变矩阵正交特性,因此,可将上式改写为:

    

,利用正交特性有:

    

,可求解 

    同理,利用第三行与第一行正交可求解 

,当焦距相等时,可估计焦距为

。 

5 全局配准

    由于每对图像间的配准估计均可能存在误差,当多幅图像通过图像对间配准参数配准时,会形成累积误差,

    这在全景图像拼接中可能产生缝隙或者过叠加,所以需要校正图像对间配准参数,称作光束平差法(bundle adjustment)。

    在光束平差法之前,通过图像对间特征点匹配情况可以剔除一些孤立图像,然后在保留图像中进行全局配准。

    假设有 n 帧图像用于形成全景图像,三维空间中有 m 个特征点在至少两帧图像中形成了映射关系,

    

 表示第  i 个三维空间点,

 表示第 i 个三维空间点在第 j 帧图像上形成的投影点,

 表示得 i 个三维空间点在第 j 帧图像上是否存在投影点。

    利用旋转全景模型可建立 

 到 

 的映射为 

    最小化 

 即可。

    完成全局配准后,全景图像仍然可能存在局部错位,这可能是因为镜头镜像畸变,摄像头没有完全绕光轴中心旋转,场景中微小抖动等因素引起。

    可以通过对整幅全景图像建立一个类似稠密光流估计图来抵消局部误差,方法如下:

    1)已经通过光束平差法重新估计了变换矩阵;

    2)利用 

 计算第 j 帧图像对应的第 i 个特征点位置;

    3)求所有图像帧上对应的第 i 个特征点的平均位置 

    4)求第 i 个特征点在第 j 帧图像上的精确位置 

    5)求第 i 个特征点在第 j 帧图像上扰动 

;

    6)使用插值构造全景图像上局部扰动,用于全景拼接时补偿局部模糊。

6 图像合成

    当所有相关图像都完成注册后,我们可以利用以上信息产生一张完整的拼接图像,这个过程大致包括以下内容:

    1)选择合成表面,当少量图像拼接时,可以选择平坦全景图;当全景图视野很大时,如果选择平坦全景图,

    则在周边区域会产生很大扭曲变形,这时一般选择圆柱面投影或者球面投影;

    2)决定那一帧图像作为中间参考图像,由于已经知道每一帧图像对应的旋转角度,一般旋转平均旋转角度附近的图像作为中间参考图像;

    3)将参考图像平移到合成表面中心,将其他图像按已知注册信息映射到合成表面;

    4)在重叠部分通过加权方式去除虚影;

    5)使用拉普拉斯金字塔融合方案融合图像,必要时进行曝光补偿。

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

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

相关文章

Linux基本指令篇 —— whoami指令

whoami 是 Linux 和 Unix 系统中一个简单但实用的命令,全称 Who Am I(我是谁)。它的功能是显示当前登录用户的用户名。以下是关于 whoami 的详细解析: 目录 1. 基本用法 2. 命令特点 3. 实际应用场景 场景 1:脚本中…

华为OD机试真题——仿LISP运算(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

创建dummy

访客_dc1fc4 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int left0;int right0;int n nums.size(); int sum0;int ans100001; for(right0;right<n;right) { sumnums[right]; //每次更新右端点之后&#xff0c;立即向右移动…

面向恶劣条件的道路交通目标检测----大创自用(当然你也可以在里面学到很多东西)

全部内容梳理 目标检测的两个任务&#xff1a; 预测标签 边界框 语义分割 实力分割 一个是类别 一个是实例级别 分类任务把每个图像当作一张图片看待 所有解决方法是先生成候选区域 再进行分类 置信度&#xff1a; 包括对类别和边界框预测的自信程度 输出分类和IOU分数的…

需求管理工具使用不当,如何优化?

要优化需求管理工具的使用&#xff0c;需从选择合适工具、规范使用流程、加强用户培训、统一数据结构、定期审查与优化使用配置五个方面着手。其中&#xff0c;选择合适工具是前提。错误的工具选择往往会导致项目沟通效率低、需求追踪失效甚至造成交付物偏离客户预期。因此&…

openwrt虚拟机安装调试

分类 lienol lean immortalwrt 一、获取固件 &#xff08;1&#xff09;下载地址 1.官网构建下载 OpenWrt Firmware Selector 官网 OpenWrt Firmware Selector 2.第三方构建网站 ImmortalWrt Firmware Selector ImmortalWrt Firmware Selector 3.第三方构建下载 ht…

Apache OFBiz 17.12.01 的远程命令执行漏洞 -Java 反序列化 + XML-RPC 请求机制

目录 漏洞原理 &#x1f3af; 一、漏洞背景&#xff08;CVE-2020-9496&#xff09; ⚙️ 二、攻击原理简述 &#x1f9f1; 三、完整攻击流程步骤详解 &#x1f50e; 1. 信息收集 &#x1f6e0;️ 2. 工具准备 &#x1f9ea; 3. 构造初始 payload&#xff1a;下载恶意脚本…

最好用的wordpress外贸主题

产品展示独立站wordpress主题 橙色的首页大banner外贸英文wordpress主题&#xff0c;适合用于产品展示型的外贸网站。 https://www.jianzhanpress.com/?p8556 Machine机器wordpress模板 宽屏简洁实用的wordpress外贸建站模板&#xff0c;适合工业机器生产、加工、制造的外贸…

Q1:Go协程、Channel通道 被close后,读会带来什么问题?

在 Go 语言中&#xff0c;Channel&#xff08;通道&#xff09;关闭后读取的行为是一个常见但需要谨慎处理的问题。以下是详细的分析和注意事项&#xff1a; 1. 关闭 Channel 后读取的行为 (1) 读取已关闭的 Channel 剩余数据仍可读取&#xff1a; 关闭 Channel 后&#xff0…

【AI Study】第三天,Python基础 - 同NumPy类似的类库

学习计划&#xff1a;AI Study&#xff0c;学习计划源码地址&#xff1a;https://github.com/co-n00b/AI-Study.git 2025-05-23 在学习NumPy的过程中&#xff0c;除了了解NumPy之外&#xff0c;我们也对比看看其他类似的类库都有什么&#xff1f;各自的优缺点是什么&#xff1…

基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统

详细视频:【基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统。-哔哩哔哩】 https://b23.tv/zfqLWPV

人工智能100问☞第32问:什么是迁移学习?

目录 一、通俗解释 二、专业解析 三、权威参考 迁移学习就是让AI把在一个任务中学到的本事&#xff0c;拿来加速另一个任务的学习&#xff0c;实现“举一反三”。 一、通俗解释 想象你已经学会了打乒乓球&#xff0c;现在去学打网球&#xff0c;是不是会学得更快&#xff…

Linux之概述和安装vm虚拟机

文章目录 操作系统概述硬件和软件操作系统常见操作系统 初识LinuxLinux的诞生Linux内核Linux发行版 虚拟机介绍虚拟机 VMware WorkStation安装虚拟化软件VMware WorkStation 安装查看VM网络连接设置VM存储位置 在VMware上安装Linux(发行版CentOS7)安装包获取CentOS7 安装 Mac系…

两个mysql的maven依赖要用哪个?

背景 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>和 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId> &l…

复杂项目中通过使用全局变量解决问题的思维方式

最近接手了一个公司的老系统的PHP项目&#xff0c;里面的代码比较混乱&#xff0c;排查解决了一个问题&#xff0c;决定将这个思路记录下来&#xff0c;希望能帮助更多的人。 其中一部分的代码信息如下&#xff1a; 备注&#xff1a;为了避免公司的相关数据信息暴露&#xff0…

V9数据库替换授权

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;9.0 文档用途 1、本文档用于指导V9数据库替换授权。 2、V9数据库授权文件为license.dat。 详细信息 1、上传新的授权文件到服务器并修改授权文件属主为…

初识 Flask 框架

目录 1. Flask 框架概述 1.1 安装 Flask 1.2 创建你的第一个 Flask 应用 1.3 运行 Flask 应用 2. Flask 路由与视图函数 2.1 动态路由 2.2 支持多种 HTTP 请求方法 2.3 使用 Jinja2 模版渲染 HTML 2.5 模版继承与块 3. Flask 表单处理与用户输入 3.1 安装 Flask-WTF …

《深入剖析:Python自动化测试框架之unittest与pytest》

unittest作为Python标准库的一部分&#xff0c;犹如一位沉稳可靠的“老工匠”&#xff0c;默默为无数项目提供着坚实的测试基础。它诞生于Python社区长期的实践沉淀&#xff0c;拥有一套标准化的测试体系&#xff0c;就像一套精密的仪器&#xff0c;各个部件各司其职。 unitte…

【Python 命名元祖】collections.namedtuple 学习指南

&#x1f4da; collections.namedtuple 学习指南 命名元组&#xff08;namedtuple&#xff09;是 Python collections 模块中一种增强型元组&#xff0c;支持通过字段名访问元素&#xff0c;同时保持元组的内存效率和不可变性。 一、基础用法 1. 定义命名元组 from collectio…

iOS知识复习

block原理 OC block 是个结构体&#xff0c;内部有个一个结构体成员 专门保存 捕捉对象 Swift闭包 是个函数&#xff0c;捕获了全局上下文的常量或者变量 修改数组存储的内容&#xff0c;不需要加_block,修改数组对象本身时需要 weak原理 Weak 哈希表 &#xff08;散列表&a…