这篇文章主要是对 Hugin 开源软件中 <libpano/math.c> 的 plane_transfer_to_camera() 和 plane_transfer_from_camera() 等函数的原理分析与总结。

在《鱼眼图像的全景矫正》这篇文章中,我们已经详细介绍了如何将一幅鱼眼图像映射到对应的 360 度全景图像上,其基本模型如图 1 所示。三维坐标 O X Y Z {OXYZ} OXYZ 表示的是我们所处的物理空间,其中 Y Y Y 轴指向我们所面朝的方向, Z Z Z 轴指向天空, X X X 轴指向我们的右手侧。而以坐标原点 O O O 为球心的球面则可视为拍摄所使用的鱼眼镜头, O O O 点即镜头的光心,将球面展开为平面即为我们所需要的全景图像。下面的二维平面 O ′ X f Y f O'X_fY_f O′Xf​Yf​ 为相机的成像平面。拍摄时,从 P P P 点出发的光线沿着直线 O P OP OP 到达光心 O O O 点,并发生折射,其中折射特性由镜头的设计模型和制造工艺决定,通常采用的是线性模型,即折射角线性正比于入射角。最终,折射后的光线沿着直线 O P 1 OP_1 OP1​ 到达成像平面,因为此时成像平面上的图像是180度颠倒的,为了方便我们通常使用的是点 P 1 P_1 P1​ 关于原点对称的点 P 2 P_2 P2​。所有这些点 P 2 P_2 P2​ 就组成了我们所获得的鱼眼图像。鱼眼图像的矫正的主要工作就是从球面上的 P P P 点坐标计算出其对应的鱼眼图像上的坐标 P 2 P_2 P2​,从而通过插值获得点 P P P 的像素值。

图1 鱼眼投影示意图

从图 1 可以看到,从球面到成像平面的映射具有一定的局限性,即现实中我们无法制造一个具有完整球面的镜头,这样就无法在一次拍摄中获得完整的360度的视角。然而,要制造出一个视角大于180度的鱼眼镜头并不难,如果我们使用这样的镜头,让它朝着 Y Y Y 轴正方向拍摄一幅图像,然后绕着 Z Z Z 轴旋转180度,即朝着 Y Y Y 轴的负方向再拍摄一幅图像,理论上我们就能获得覆盖整个球面的具有360度视角的图像了。这就是多目鱼眼图像拼接所要做的事情。但这种方法也存在致命的缺陷,即我们无法拍摄运动场景的全景画面,因为这种方法中不同视角的图像来自不同的时刻。这时,我们很容易想到使用两个具有相同参数的鱼眼相机,分别朝着 Y Y Y 轴的正负方向安装,经过同步后似乎就可以同时获取360度视角的内容了。但问题又来了,因为两个鱼眼镜头的光学中心并不在同一个物理空间点上,我们称之为光心偏移,即图 1 中实际存在着两个不同位置的球面,空间中某个点分别沿着经过球心的直线到达这两个球面时,其相对于两个球心的经纬度坐标并不一样。因此,我们无法直接把一个球面上的内容复制到另一个球面上,否则会在画面交界处出现断层,也就是所谓的视差,这个问题在近景拍摄中尤为明显。要完美解决视差的问题通常十分困难,大多数情况下甚至是不可能的,因为从三维物理空间到二维图像平面的映射本身就是信息丢失的过程。因此,我们只能对一些特定的问题进行求解。例如,假设我们所拍摄的内容都在一个平面上?

图2 光心偏移校正示意图

图 2 展示了基于平面假设的鱼眼镜头光心偏移校正的过程,主要参考了开源软件 Hugin 中所使用的方法,并通过阅读代码对其原理进行大致的归纳。为了便于理解,这里简化为二维的情况,其原理对于三维空间同样适用。其中点 O O O 是主相机的光心位置,也就是图 1 的物理坐标系原点。点 P 1 P_1 P1​ 是副相机的镜头光心所在位置, O P 1 OP_1 OP1​ 即两个镜头的光心偏移量。注意在点 O O O 和点 P 1 P_1 P1​ 上建立的坐标系方向是一致的,镜头的偏航、俯仰和旋转可通过其他的步骤进行处理,因此这里只涉及光心的平移。图 2 中的点的坐标都是以点 O O O 为原点的。

假设在副相机的鱼眼图像上有一个控制点(即用于参数优化的点),其经过鱼眼投影模型的逆映射后得到的球面坐标为 P 2 P_2 P2​,那么该控制点实际对应的透视投影点应该为 P 3 P_3 P3​。我们只能知道该控制点对应的真正的空间坐标点在点 P 1 P_1 P1​ 和 P 3 P_3 P3​ 的延长线上,但无法知道相应的距离。这时我们需要一些假设条件,如假设在点 P 0 P_0 P0​ 处有一张平面,例如一堵墙,其与直线 O P 0 OP_0 OP0​ 垂直,其中 P 0 P_0 P0​ 在以点 O O O 为球心的球面上的经纬度坐标已知。注意,我们并不需要知道平面的真实距离。当该平面前方没有物体遮挡,即为前景时,我们就可以知道 P 3 P_3 P3​ 实际来自于直线 P 1 P 3 P_1P_3 P1​P3​ 和该平面的交点 P 5 P_5 P5​,其中直线 P 1 P 3 P_1P_3 P1​P3​ 和 O P 0 OP_0 OP0​ 的夹角不能大于等于90度。如此,即可求得点 P 5 P_5 P5​ 沿着直线 O P 5 OP_5 OP5​ 到达以 O O O 点为球心的球面上的交点 P P P 的经纬度坐标。

根据三角形的相似性,有

P 1 A = P 1 P 3 → T ⋅ P 1 P 4 → P 1 P 4 = O P 2 → T ⋅ O P 0 → O P 0 , (1) {P_1}A = \frac{{{{\overrightarrow {{P_1}{P_3}} }^T} \cdot \overrightarrow {{P_1}{P_4}} }}{{{P_1}{P_4}}} = \frac{{{{\overrightarrow {O{P_2}} }^T} \cdot \overrightarrow {O{P_0}} }}{{O{P_0}}}, \tag{1} P1​A=P1​P4​P1​P3​ ​T⋅P1​P4​ ​​=OP0​OP2​ ​T⋅OP0​ ​​,(1)

P 1 B = P 1 P 0 → T ⋅ P 1 P 4 → P 1 P 4 = ( O P 0 → − O P 1 → ) T ⋅ O P 0 → O P 0 , (2) {P_1}B = \frac{{{{\overrightarrow {{P_1}{P_0}} }^T} \cdot \overrightarrow {{P_1}{P_4}} }}{{{P_1}{P_4}}} = \frac{{{{\left( {\overrightarrow {O{P_0}} - \overrightarrow {O{P_1}} } \right)}^T} \cdot \overrightarrow {O{P_0}} }}{{O{P_0}}}, \tag{2} P1​B=P1​P4​P1​P0​ ​T⋅P1​P4​ ​​=OP0​(OP0​ ​−OP1​ ​)T⋅OP0​ ​​,(2)

P 1 P 3 P 1 P 5 = P 1 A P 1 B ⇒ P 1 P 5 → = P 1 B P 1 A ⋅ P 1 P 3 → . (3) \frac{{{P_1}{P_3}}}{{{P_1}{P_5}}} = \frac{{{P_1}A}}{{{P_1}B}} \Rightarrow \overrightarrow {{P_1}{P_5}} = \frac{{{P_1}B}}{{{P_1}A}} \cdot \overrightarrow {{P_1}{P_3}} . \tag{3} P1​P5​P1​P3​​=P1​BP1​A​⇒P1​P5​ ​=P1​AP1​B​⋅P1​P3​ ​.(3)

那么,

O P 5 → = O P 1 → + P 1 P 5 → = O P 1 → + P 1 B P 1 A ⋅ O P 2 → = O P 1 → + ( O P 0 → − O P 1 → ) T ⋅ O P 0 → O P 2 → T ⋅ O P 0 → ⋅ O P 2 → . (4) \overrightarrow {O{P_5}} = \overrightarrow {O{P_1}} + \overrightarrow {{P_1}{P_5}} = \overrightarrow {O{P_1}} + \frac{{{P_1}B}}{{{P_1}A}} \cdot \overrightarrow {O{P_2}} = \overrightarrow {O{P_1}} + \frac{{{{\left( {\overrightarrow {O{P_0}} - \overrightarrow {O{P_1}} } \right)}^T} \cdot \overrightarrow {O{P_0}} }}{{{{\overrightarrow {O{P_2}} }^T} \cdot \overrightarrow {O{P_0}} }} \cdot \overrightarrow {O{P_2}} .\tag{4} OP5​ ​=OP1​ ​+P1​P5​ ​=OP1​ ​+P1​AP1​B​⋅OP2​ ​=OP1​ ​+OP2​ ​T⋅OP0​ ​(OP0​ ​−OP1​ ​)T⋅OP0​ ​​⋅OP2​ ​.(4)

同理,如果我们知道 P P P 点在以 O O O 点为球心的球面上的经纬度坐标,那么点 P 5 P_5 P5​ 在以 P 1 P_1 P1​ 点为球心的球面上的透视投影点 P 3 P_3 P3​ 相对于点 P 1 P_1 P1​ 的坐标为

O P 5 O P = O P 0 O P → T O P 0 → / O P 0 ⇒ O P → 5 = O P 0 2 O P → T O P 0 → O P → , (5) \frac{{O{P_5}}}{{OP}} = \frac{{O{P_0}}}{{{{\overrightarrow {OP} }^T}\overrightarrow {O{P_0}} /O{P_0}}} \Rightarrow {\overrightarrow {OP} _5} = \frac{{OP_0^2}}{{{{\overrightarrow {OP} }^T}\overrightarrow {O{P_0}} }}\overrightarrow {OP} ,\tag{5} OPOP5​​=OP TOP0​ ​/OP0​OP0​​⇒OP 5​=OP TOP0​ ​OP02​​OP ,(5)

P 1 P 5 → = O P 5 → − O P 1 → ⇒ O P 2 → = P 1 P 3 → = P 1 P 5 → / ∥ P 1 P 5 → ∥ . (6) \overrightarrow {{P_1}{P_5}} = \overrightarrow {O{P_5}} - \overrightarrow {O{P_1}} \Rightarrow \overrightarrow {O{P_2}} = \overrightarrow {{P_1}{P_3}} = \overrightarrow {{P_1}{P_5}} /\left\| {\overrightarrow {{P_1}{P_5}} } \right\|.\tag{6} P1​P5​ ​=OP5​ ​−OP1​ ​⇒OP2​ ​=P1​P3​ ​=P1​P5​ ​/∥∥∥​P1​P5​ ​∥∥∥​.(6)

平面假设的前提是,所有点都是来自于同一个平面的,这也是为什么说我们不需要知道该平面的真实距离的原因(但需要知道具体的方位),然而这并不总是成立的,相反,在很多场景应用中都不可能存在可以覆盖大部分视场的平面。因此,这种方法更加适合于大面积平面图像如墙壁涂鸦的多相机拼接。当然,这也十分适合于多目鱼眼相机光心距离的估计,因为控制点都出现在各镜头的重叠视场内,而这部分视场是相对比较小的,我们可以利用一个棋盘格来提供这么一个足够大的平面。然而,即使我们已经得到了光心距离比较准确的估计,在实际鱼眼图像矫正中,如果我们不能提供所需的平面,由于空间点的来源比较复杂,依然还是难以避免出现视差。

鱼眼相机中基于平面假设的光心偏移校正相关推荐

  1. 一文尽览 | 计算机视觉中的鱼眼相机模型及环视感知任务汇总!

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 论文 ...

  2. AVM环视系统:鱼眼相机去畸变算法及实战

    作者丨中投靓仔@知乎 来源丨https://zhuanlan.zhihu.com/p/603296375 编辑丨自动驾驶与AI 点击进入->3D视觉工坊学习交流群 前言 在近一年的AVM算法开发 ...

  3. 一文尽览 | 全景/鱼眼相机低速自动驾驶的近距离感知(识别+重建+定位+工程化)...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨汽车人 来源丨自动驾驶之心 Camera是自动驾驶系统中的主要传感器,它们提供高信息密度,最适合 ...

  4. 一文讲透鱼眼相机畸变矫正,及目标检测项目应用

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1 个人介绍 大家好,我是潘大强. 目前博士毕业4年,主要从事智能安防行业. 之前也分享过AI从业的一 ...

  5. 鱼眼相机图像畸变校正

    0.前言 有关鱼眼相机成像模型相关知识,参考我的这篇文章.通过对鱼眼相机做内参标定,可以得到相机的内参和畸变参数.利用上述参数,可以对鱼眼相机获取的原始畸变图像做畸变校正. 1.畸变校正原理 简单回顾 ...

  6. 相机内参_鱼眼相机标定模型

    Camera Calibration是计算Camera的extrinsic(外参)和 intrinsic(内参)的过程.一旦你标定完成了一个camera,你即可从2维图像中去恢复3维图像.你同样可以在 ...

  7. 在结构化场景中基于单目的物体与平面SLAM方案

    点云PCL免费知识星球,点云论文速读. 文章:Monocular Object and Plane SLAM in Structured Environments 作者:Shichao Yang, S ...

  8. 详解 | 自动泊车中鱼眼相机实现车位线感知

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达文章导读 本文是一篇介绍鱼眼相机做车位线检测的文章,放眼当下泊车功能 ...

  9. 【OpenCV】中的鱼眼相机及其标定

    1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform): 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到 ...

最新文章

  1. Linux-鸟菜-6-文件搜索
  2. ITK:通过包装填充图像
  3. 学习转载:Linux命令--grep|正则表达式
  4. pku 3270 Cow Sorting 置换群
  5. 函数式编程工具:filter和reduce
  6. zigbee协议技术无线模块对智能家居市场前景分析
  7. LeetCode 1054. 距离相等的条形码(优先队列)
  8. MySQL增量备份及恢复
  9. linux文件目录加密,适用于Linux的10款最佳文件和磁盘加密工具
  10. fastgame文档
  11. 有没有可以干一辈子的工作?
  12. 台式计算机如何自动开关机,电脑怎么设置自动关机时间 电脑自动开机时间怎么设置...
  13. 债券收益率建模(时间序列建模)时间序列相似度度量
  14. 写字楼如何实现无线wifi短信验证登录?
  15. 人大金仓V8R6 for RHEL7.6
  16. php理论掌握太少,科学网—我为什么反对让学生过早地选课和选考 - 冯大诚的博文...
  17. opencv中Mat与vector互转
  18. Vue 实现Redis管理页面
  19. HTMLCSS 高级表格 合并单元格
  20. 单链表的应用---通讯录设计(数据结构课设)

热门文章

  1. 1071: [SCOI2007]组队
  2. spring09--bean后置处理器
  3. 华为手机助手应用程序被篡改,请重新安装或升级
  4. D-Link DWL-G122 USB无线网卡驱动安装配置
  5. 这些词真的不该出现在简历上!
  6. input delay和output delay讲解
  7. 【mysql5.1.47会报一个时间戳设置未null的错】
  8. 配置IPv4静态路由
  9. 关于魔域游戏木马的设计问题
  10. 第5节-AxureRP 9快捷键大全 | 剑雨Axure RP9系列【基础】