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

基于三维反投影矫正拼接视频

三维投影算法

三维投影算法分为

  1. 柱面投影
  2. 球面投影
  3. 柱面投影+球面投影
  4. 抛物线投影

    柱面投影和球面投影是地图投影、计算机图形学等领域中常用的投影方法,核心是将三维球面(或球体表面)的点映射到二维平面(柱面投影先映射到柱面再展开为平面)。这里我们使用圆柱投影,圆柱分为外壁投影和内壁投影,我们会选择内壁投影来解决问题。

1 外壁投影

适用场景:实际上在做图像拼接的时候需要使用正向外壁投影,公式推导需基于坐标系定义(通常以地心为原点,赤道面为 XY 平面,本初子午线为 X 轴)。我们主要不讲拼接,主要是来做反向图像矫正,所以将内壁投影

2 内壁投影

1 坐标系:

图像上的点:​​(x, y)​​ (在图像平面 Z = f 上)
相机焦距(或归一化焦距):​f​
圆柱半径:​r​
圆柱展开图宽度:​W,高度:​H

2 映射到圆柱内壁上的 3D 点 (X, Y, Z)​​:
在这里插入图片描述
这就是该图像点所对应的圆柱内壁上的三维点

2. ​映射到柱面展开图 (u, v) 坐标
水平方向角度:
在这里插入图片描述
水平方向图像坐标:

在这里插入图片描述

垂直方向(可线性映射,比如基于 Y 或 Z):
在这里插入图片描述

困难:
除了计算,有一点我们需要非常清楚,安装的摄像头并不一定是正向安装,我们会看到各种角度的俯仰角,翻滚角,偏航角,也就是摄像头实际安装的样子是不可确定的,在空中有各种姿态,所有又有一下矩阵需要参与计算

绕Y轴旋转(Y 偏航)

1 绕 Y 轴旋转 yawRad 角度(左右转动),旋转矩阵为
[cosY    0 sinY  ]
[0        1      0    ]
[-sinY 0   cosY  ]

绕X 轴旋转(P 俯仰角)

[1      0     0      ]
[0 cosP sinP    ]
[0 -sinP cosP   ]

绕z轴旋转(R 翻滚)

[cosR -sinR   0  ]
[sinR cosR   0   ]
[0        0      1    ]

实际投影

先看一个拼接图像,是经过拼接后的图像,一看挺麻烦的,因为两边的经度已经成为枕形畸变,而上下纬度为桶形畸变,这个鹰眼相机异曲同工,不过还算好一些

在这里插入图片描述

界面制作

焦距确定如何拉直纬线,纬线和赤道平行, 俯仰实际就是安装摄像头的往下或者往上看的角度,确定经线的垂直度,翻滚角确定图像是否正对我们还是有偏移旋转。首先改变焦距让图像在纬度上拉直:
在这里插入图片描述

应为摄像机安装的时候是斜俯视,我们将俯仰往下拉,让经线完全直立,我们观察两边的篮球架要直立才能达到我们正常观看比赛的目的
在这里插入图片描述

在这里插入图片描述
使用翻滚角将图像变正,因为本身相机是个拼接相机,可能看到的图像会比较奇怪,中间白线左右有些不对称,我们忽略
在这里插入图片描述

偏航

ok 到这里我们看到了正常的直立的图像,问题来了,左右像素缺失,如何做,这时候我们已经深处三维投影中,我们来左右改变偏航来看:
在这里插入图片描述
在这里插入图片描述
可以看到通过三维偏航我们可以看到完整的图像,已经被直立和矫正,ok,我们再来一个深度的应用

三维偏航AI 跟踪系统

我们使用AI来跟踪球员的密集度和球的位置,来左右偏航,让拼接相机在根本不动的情况下左右自动偏航,让观察者认为我们的系统有云台功能
在这里插入图片描述
放大和缩小,抗锯齿功能

在这里插入图片描述

矩阵优化,解码编码优化

    我们完成了图像上的三维投影,如何做到视频上能够到一秒30帧4K分辨率转化呢,我们的策略是优化矩阵运算,将所有的矩阵合并,将来图像只要一次矩阵运算就完成投影,再进行显卡的优化,图像的解码,矩阵运算,编码运算完全在GPU的显存上运行,不出GPU,编码完了以后再出显存到内存,使用rtsp协议直接建立自身服务,不推流,这样极大减小了消耗,部署上也更加方便。
在运算基础上,我们还可以在进行各种图像处理运算,优化到视频的一秒30帧左右。

在这里插入图片描述

其他矫正

其他矫正还有很多,例如球面和抛物线矫正,下次我们再将更多的算法,例如鱼眼图像的矫正,鹰眼图像,隧道图像,仓库,这些都需要矫正成正常的图像去观察,我们放到其他的文章里面介绍
在这里插入图片描述

http://www.xdnf.cn/news/19287.html

相关文章:

  • TJA1445学习笔记(二)
  • 咨询进阶——解读 目标管理实务:知识概述、管理概述和实施【附全文阅读】
  • 计算机视觉(四):二值化
  • MySQL面试集合
  • 【C++ 】STL详解(六)—手撸一个属于你的 list!
  • 力扣热题100:合并区间详解(Java实现)(56)
  • 在SAP系统中,如何查询已经被打上了删除标记的生产订单?
  • 数据结构(04)—— 栈和队列
  • [每周一更]-(第158期):构建高性能数据库:MySQL 与 PostgreSQL 系统化问题管理与优化指南
  • 【lua】元表、元方法 详解及应用
  • 【LeetCode_27】移除元素
  • Ubuntu中通过SSH克隆Windows的远程Git仓库(局域网中挺有用)
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:二维数组较简单题目的解析
  • Unity核心概念①
  • 准备机试--图【y总版】[重要]【最短路】
  • 三重积分的对称性
  • shell编程-核心变量知识
  • 面试专栏
  • Agent实战教程:LangGraph结构化输出详解,让智能体返回格式化数据
  • 第N个丑数
  • 文件夹和文件一键加密,保护你的隐私
  • CRM、ERP、HRP系统有啥区别?
  • 本地运行 Ollama 与 DeepSeek R1 1.5B,并结合 Open WebUI 测试
  • 安卓编程 之 线性布局
  • 数组去重【JavaScript】
  • 基于 MyBatis-Plus 拦截器实现锁定特殊数据(二)
  • kmp 算法
  • 42-Ansible-Inventory
  • 模式组合应用-组合模式
  • SpringAI应用开发面试剧本与技术知识全解析:RAG、向量数据库、多租户与企业落地场景