惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
量子位
S
SegmentFault 最新的问题
博客园 - 聂微东
博客园 - 【当耐特】
J
Java Code Geeks
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
V
V2EX
人人都是产品经理
人人都是产品经理
博客园 - Franky
罗磊的独立博客
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
鱼眼相机原理
Yiwei Zhang · 2024-10-10 · via 又见苍岚

鱼眼相机是一种特殊的相机,其镜头具有超大视角,能够捕捉到非常广阔的场景,本文介绍相机原理。

鱼眼相机

设计来源

为什么要设计鱼眼镜头

鱼眼镜头设计的目的是要拍摄大的视野,鱼眼镜头的视场角可达到180-270度,在工程上视角超过140度的镜头被统称为鱼眼镜头。这是因为普通针孔相机视野太小,满足不了一些特别的需求。

为什么针孔相机达不到这么大的视场角呢?因为针孔相机模型是相似性投影,实际场景中的直线仍被投影成图像面上的直线。假如使用针孔相机模型达到180度的视场角,那么这种情况下的图像会变为无穷大。

那么怎么设计才能达到这种大视场角的效果

为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机将相机畸变列为其成像特征用以在有限的图像平面内表达本应落在无穷远处的空间点投影。

鱼眼镜头设计采用非相似性成像,在成像过程中引入畸变,引入畸变的作用是通过对直径空间的压缩,突破成像视角的局限,从而达到广角成像。

鱼眼镜头是为了大视野,自动放弃了相似性成像,选择非相似性成像。因此经入射光线经过镜头之后射向成像面,其出射角一定是要小于入射角的。

因此设计出了鱼眼镜头

鱼眼镜头是由十几个不同的透镜组合而成的,在成像过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比拥有更大的视野。

结构中前面的类似凸的镜头发生折射,使入射角减小,其余镜头相当于一个成像镜头。

镜头模型

鱼眼镜头一般是由十几个不同的透镜组合而成的,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。下图表示出了鱼眼相机的一般组成结构。最前面的两个镜头发生折射,使入射角减小,其余的镜头相当于一个成像镜头,这种多元件的构造结构使对鱼眼相机的折射关系的分析变得相当复杂。

鱼眼相机成像时遵循的模型可以近似为单位球面投影模型。可以将鱼眼相机的成像过程分解成两步:

  • 第一步,三维空间点线性地投影到一个球面上,它是一个虚拟的单位球面,它的球心与相机坐标系的原点重合;
  • 第二步,单位球面上的点投影到图像平面上,这个过程是非线性的。

投影函数

为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为四种:等距投影模型、等立体角投影模型、正交投影模型和体视投影模型。下面的四种鱼眼相机的投影模型反映出了空间中的一点P是如何投影到球面上,然后到图像平面上成像的。

等距投影模型

等距投影模型的投影关系在入射光线之间的角度相同时,保持其对应各投影点之间的间距相同。其投影模型为:
$$
r_d=f\theta
$$
$r_d$ 表示图像中点到畸变中心的距离,即成像高度;$f$ 为鱼眼相机的焦距,$θ$ 是入射光线与鱼眼相机光轴之间的夹角,即入射角。

等立体角投影模型

等立体角的特点是相等立体角的入射面会产生相等面积的像,其畸变程度介于等距模型与正交模型之间。其模型如下:
$$
r_d=2f \sin \frac{\theta}{2}
$$

正交投影模型

正交投影模型的畸变很大,近180度处的图像信息几乎全部丢失,且180度之外的场景区域将无法进行描述。采用这种模型的镜头拍出的图片即使在视角较小的区域也会比其他模型镜头的畸变更明显。因此,针对艺术摄影类的广角镜头,该模型的校正效果更好。其模型如下:
$$
r_d = f \sin \theta
$$

体视投影模型

体视模型相比之下畸变最小,球形物面上的微小面元经过体视投影后,其像仍然是一个小圆。所以体视投影对微小物体成像有相似性。但正是这种成像的相似性,使得该投影方式不能提供足够的桶形畸变,影响成像视场。其模型如下:
$$
r_d=2f \tan \frac{\theta}{2}
$$

几种投影模型的区别

四种畸变模型畸变量从大到小依次为:正交投影、等立体角投影、等距投影、体视投影。由于等距投影模型便于计算,因此被各大工程广泛应用。

通用鱼眼相机模型

通用鱼眼相机模型 为 Kannala-Brandt 模型.

鱼眼镜头生产过程中不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala-Brandt 提出了一种鱼眼相机的一般多项式近似模型。通过前面四个模型,可以发现 $θ_d$ 是$\theta$ 的奇函数,将这些式子按泰勒级数展开,发现 $θ_d$ 用 $θ$ 的奇次多项式表示,即:

$$ \theta_d=\theta+k_1\theta^3+k_2\theta^5+\cdots $$ 取前5项,给出了足够的自由度来很好的近似各种投影模型。 $$ \theta_d=\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9 $$

上式是根据四种鱼眼相机投影模型得出的一种通用鱼眼相机多项式模型。

这种模型可以通过 $θ$ 得到 $θ_d$,通过无畸变图像中的点能够计算出鱼眼图像中的畸变点。

OpenCV 中鱼眼相机标定方法就是用的这种 KB 模型。

投影过程

Step1. 世界坐标系转相机坐标系 Camera,相机坐标系下的一点 $P(X_c,Y_c,Z_c)$。
$$
X_c=RX+T
$$
Step2. camera转归一化相机球面上

$$ \begin{aligned}&x=Xc_1\\&y=Xc_2\\&z=Xc_3\quad a=x/z\mathrm{~and~}b=y/z\end{aligned} $$

Step3. 计算θ角

$$ \begin{cases}r=\sqrt{x_c^2+y_c^2}\\\theta=atan2(r,|z_c|)=atan2(r,1)=atan(r)\end{cases} $$

由直角三角形正切公式推出。

其中 $r$ 为景物通过鱼眼相机投影在传感器上的像高,即图像中像素点到主点的距离。

Step4. 利用KB畸变模型进行加畸变处理

因为镜头设计有误差,$θ --> θ_d$。

$$ \theta_d=\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9 $$ $$ \theta_d=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8) $$

Step5. 计算该点在图像物理坐标系中的坐标

根据等距投影模型,$d=fθ_d$,$f=1$,由三角形相似,$d/r=x’/a $推导出以下公式: $$ x^{\prime}=(\theta_d/r)a\\y^{\prime}=(\theta_d/r)b $$

Step6. 最终图像像素坐标系uv

$$ u=f_x(x^{\prime}+\alpha y^{\prime})+c_x\\v=f_yy^{\prime}+c_y $$ 这一步α是扭曲系数,$f_x$,$f_y$,$c_x$,$c_y$ 是鱼眼镜头的内参矩阵,作用是两个二维平面间的缩放和平移。缩放是要把物理单位转成像素单位,平移是坐标原点对齐。 $$ A=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix} $$ 总结过程: $$ \begin{aligned}&\theta=\arctan(\sqrt{x^{2}/z^{2}+y^{2}/z^{2}})\\&\theta_{d}=\theta+k_{0}\theta^{3}+k_{1}\theta^{5}+k_{2}\theta^{7}+k_{3}\theta^{9}\\&r=f\theta_{d}\\&x=rX/\sqrt{X^{2}+Y^{2}}\\&y=rY/\sqrt{X^{2}+Y^{2}}\\&u=x+c_{x}\\&v=y+c_{y}\end{aligned} $$

参考资料

文章链接:
https://www.zywvvd.com/notes/study/camera-imaging/fisheye/fisheye/