鱼眼相机模型和标定

Hello,欢迎来到我的博客~
今天的内容是鱼眼相机的建模方法和标定工具的使用
主要会介绍鱼眼相机和普通透视相机的联系,以及一种简单的鱼眼相机模型,和标定方法

1 鱼眼相机与普通透视相机的关系

普通透视相机是我们在日常生活最常用的相机,它的成像模型想必大家都很了解。而鱼眼相机拍摄的图像和普通相机拍摄的有着天壤之别,所以我们直观上很难想象它是如何成像的。但是这里有一种很简单的方法,就可以将一个普通相机改造成鱼眼相机:
在这里插入图片描述

没错,在普通相机前面加一个反射镜就可以等效成一个鱼眼相机了。
大家注意了,这也是给鱼眼相机建模的一个基本思想,就是把鱼眼相机等效为一面镜子和普通相机的组合!
另外,还需要注意的是,这里我们只是说明鱼眼相机是如何等效为普通相机的。一般的鱼眼相机的实际原理并不是这样的,而是通过一系列透镜来改变光路,实现了鱼眼的效果。
普通相机+镜子构成鱼眼相机的这种系统称为:catadioptric omnidirectional cameras
通过透镜构成鱼眼相机的系统称为:dioptric omnidirectional cameras

2 鱼眼相机的类型

上面说到可以把一面镜子和一个普通相机组合,形成一个鱼眼相机。根据这面镜子的不同,可以把鱼眼相机分为:中心式(central camera)和非中心式(non central camera)两类。

2.1 非中心式(Non central camera)

非中心式相机,也可以叫做non-single effective viewpoint camera,如下图所示:
在这里插入图片描述
上图中,黑色粗直线代表成像平面,黑色粗曲线代表反射镜。从图中可以看出来,这实际上就是从外部射向镜子的光线都不相交于同一点

2.2 中心式(Non central camera)

中心式相机,也可以叫做single effective viewpoint camera,如下图所示:
在这里插入图片描述
从图中可以看出来,这种相机实际上就是从外部射向镜子的光线都相交于同一点
对于这种相机来说,这个镜子可能的形状有,双曲面(hyperbolic), 抛物面(parabolic),椭圆面(elliptical)。

3 鱼眼相机模型

鱼眼相机模型的作用是建立二维图像坐标到三维矢量间的关系。 此外,这一节介绍的相机模型是针对于中心式鱼眼相机系统的,但对于透镜构成的鱼眼还是反射镜构成的鱼眼是没有区分的。下面是一个相机模型的图示:
在这里插入图片描述

注意:

  1. 相机模型的中心建立在反射面的焦点处
  2. p p p所在的平面是成像平面,代表的是图像二维坐标
  3. P P P对应了粗的黑色矢量,是一个三维矢量,代表特征点对应的三维方向
  4. 画面最下方是一个普通相机

3.1 模型假设

实际系统存在很多误差,为了模型的实用性,因此做了如下假设,选择性的忽略了一部分误差:

  • 假设镜面沿着镜面轴是完美对称的,无论旋转多少度,都不会对光路产生变化
  • 假设不考虑相机的透镜畸变,因为这部分畸变实际上可以考虑到反射镜对应的投影函数里

3.2 相机模型-1

在这个相机模型中,我们在上边的基础上,额外加入一条假设,即:

  • 假设相机轴和反射镜的中轴完全完全对齐

于是,假设 p = ( u , v ) p=(u,v) p=(u,v)代表了特征点对应的图像坐标, P = ( x , y , z ) P=(x,y,z) P=(x,y,z)代表了从相机坐标系原点出发,指向特征点的三维矢量。
由于,相机轴和镜面轴完美对齐,所以:
[ x y ] = α [ u v ] , α > 0 \left[\begin{matrix}x\\y\end{matrix}\right]= \alpha\left[\begin{matrix}u\\v\end{matrix}\right],\alpha>0 [xy]=α[uv],α>0
其中, α \alpha α相当于一个缩放因子,它并不影响矢量的方向。
然后,根据 x x x y y y,还有曲面的形状,可以计算 z = h ( x , y ) = h ( α u , α v ) = α f ( u , v ) z=h(x,y)=h(\alpha u,\alpha v)=\alpha f(u,v) z=h(x,y)=h(αu,αv)=αf(u,v)。注意,这里 f f f h h h都代表的是曲面的形状函数,它的形式是自己定义,我们可以随意的把 α \alpha α提出来。
所以,最后的 P P P矢量可以等效为:
P = [ x y z ] = α [ u v f ( u , v ) ] P=\left[\begin{matrix}x\\y\\z\end{matrix}\right]= \alpha\left[\begin{matrix}u\\v\\f(u,v)\end{matrix}\right] P=xyz=αuvf(u,v)
由于 P P P是一个方向矢量,所以, α \alpha α没有任何影响,所以:
P = [ x y z ] = [ u v f ( u , v ) ] P=\left[\begin{matrix}x\\y\\z\end{matrix}\right]=\left[\begin{matrix}u\\v\\f(u,v)\end{matrix}\right] P=xyz=uvf(u,v)
这里,我们给出 f f f的形式:
f ( ρ ) = a 0 + a 1 ρ + a 2 ρ 2 + a 3 ρ 3 + a 4 ρ 4 + . . . f(\rho)=a_0+a_1\rho+a_2\rho^2+a_3\rho^3+a_4\rho^4+... f(ρ)=a0+a1ρ+a2ρ2+a3ρ3+a4ρ4+...
其中, ρ = u 2 + v 2 \rho=\sqrt{u^2+v^2} ρ=u2+v2
这里 a 1 ∼ a n a_1\sim a_n a1an就是鱼眼镜头的参数,也是要标定的系数。
一般来说,这个多项式的阶数是4阶时,效果是最优的。

3.3 相机模型-2

在这个模型中,我们不再假设相机轴和反射镜的中轴完全完全对齐。此外,我们还考虑了像素点发生线性变形(仿射变换)带来的误差。因此,我们将原始的像素坐标投影到一个新的平面:
[ u ′ v ′ ] = [ c d e 1 ] [ u v ] + [ u c v c ] \left[\begin{matrix}u'\\v'\end{matrix}\right]=\left[\begin{matrix}c & d\\e & 1\end{matrix}\right]\left[\begin{matrix}u\\v\end{matrix}\right]+\left[\begin{matrix}u_c\\v_c\end{matrix}\right] [uv]=[ced1][uv]+[ucvc]
其中, u c u_c uc v c v_c vc是反射镜轴和相机轴的偏移, c , d , e c,d,e c,d,e参数代表了像素线性形变。 u ′ u' u v ′ v' v就是修正过后的像素坐标。
之后,再根据修正后的像素坐标和相机模型-1,仍然可以恢复特征点的三维矢量。

4 鱼眼相机标定

本文所提鱼眼相机模型有对应的开源工具:OCamCalib
它有一个Matlab的工具箱,大家下载解压以后,进入该文件夹,用Matlab运行ocam_calib就可以打开该工具了,它的界面是这样的:
在这里插入图片描述具体的标定步骤:

  1. 采集包含棋盘格标定板的图片(6~10张),尽可能覆盖相机的所有视野范围,尽可能靠近相机一点,保证棋盘格所有角点清晰可见。最后,照片存入该工具箱的文件夹下,并且名字命名为:[image name][image num].[image type]。例如:fisheye0.jpg, fisheye1.jpg, fisheye2.jpg,…
  2. 打开ocam_calib工具箱
  3. 点击Read names按钮。会要求你输入图片名,例如:fisheye。还会要求你输入图片格式,例如:jpg。
  4. 点击Extract grid corners按钮。会要求你输入你想处理的图片编号,会让你输入棋盘格的数量,棋盘格的宽度,还有图像中心(这个参数可以不用设置,直接回车,后面会自动计算)。最后,还会让你选择自动提取角点还是手动提取,一般就直接回车,选择自动提取。
  5. 点击Calibration按钮。会要求你输入模型阶数,一般直接回车,就选择默认的4阶模型,也可以自己输入。等待一段时间后,可以得到标定的结果,也就是 f ( ρ ) f(\rho) f(ρ)函数的曲线和参数。
  6. 点击Find center按钮。这一步是要找到图像的中心,点击完之后,需要计算很长一段时间,大家耐心等待就好。
  7. 点击Calibration Refinement按钮。这一步是进一步优化标定结果,这一步会问你最大的迭代步数,直接回车就好。这一步需要等待的时间也比较长。
  8. 标定已经完成了,通过calib_data.ocam_model数据就可以查看模型参数了。另外,Reproject on images,Show Extrinsic,Analyse error等按钮也可以用来直观的显示标定结果的好坏。

参数说明
ocam_model:储存相机参数的结构体
ocam_model.ss: f ( ρ ) f(\rho) f(ρ)的系数
ocam_model.xc,ocam_model.yc:图像中心
ocam_model.c,ocam_model.d,ocam_model.e:仿射变换参数
ocam_model.width,ocam_model.height:图像尺寸

5 参考文献

[1] OCamCalib
[2] Scaramuzza, D., Martinelli, A. and Siegwart, R., (2006). “A Flexible Technique for Accurate Omnidirectional Camera Calibration and Structure from Motion”, Proceedings of IEEE International Conference of Vision Systems (ICVS’06), New York, January 5-7, 2006.
[3] Scaramuzza, D., Martinelli, A. and Siegwart, R., (2006). “A Toolbox for Easy Calibrating Omnidirectional Cameras”, Proceedings to IEEE International Conference on Intelligent Robots and Systems (IROS 2006), Beijing China, October 7-15, 2006.
[4] Scaramuzza, D. (2008). Omnidirectional Vision: from Calibration to Robot Motion Estimation, ETH Zurich, PhD Thesis no. 17635. PhD Thesis advisor: Prof. Roland Siegwart. Committee members: Prof. Patrick Rives (INRIA Sophia Antipolis), Prof. Luc Van Gool (ETH Zurich). Chair: Prof. Lino Guzzella (ETH Zurich), Zurich, February 22, 2008.

  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值