本文最后更新于:2024年10月10日 下午
鱼眼相机是一种特殊的相机,其镜头具有超大视角,能够捕捉到非常广阔的场景,本文介绍相机原理。
鱼眼相机
设计来源
为什么要设计鱼眼镜头
鱼眼镜头设计的目的是要拍摄大的视野,鱼眼镜头的视场角可达到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转归一化相机球面上
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://blog.csdn.net/u010128736/article/details/52864024
- https://www.cnblogs.com/fengliu-/p/16613328.html
- https://blog.csdn.net/danmeng8068/article/details/125557038
文章链接:
https://www.zywvvd.com/notes/study/camera-imaging/fisheye/fisheye/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信支付

支付宝支付