非参数化相机畸变模型简介

最近在看相机畸变模型相关的论文,其中有个叫非参数化模型的比较有意思:

Schöps, Thomas, Viktor Larsson, Marc Pollefeys, and Torsten Sattler. “Why Having 10,000 Parameters in Your Camera Model Is Better Than Twelve.” ArXiv:1912.02908 [Cs], June 23, 2020. http://arxiv.org/abs/1912.02908.

该论文还开源了相关代码:https://github.com/puzzlepaint/camera_calibration.

参数化的畸变模型

目前最常见的畸变模型有:

  • Brown: 即径向+切向畸变,参数有 k1, k2, k3, p1, p2
  • Rational: 有理模型,可以看作 Brown 模型的扩展,参数有 k1, k2, k3, k4, k5, k6, p1, p2
  • KB: 所谓鱼眼模型,参数有 k1, k2, k3, k4

OpenCV 中 calibrateCamera 通过 14 个参数支持 Brown、Rational 等模型,fisheye::calibrate 则用于标定 KB 模型。

其它还有 FoV、UCM、Double Sphere 等模型,可见于一些 SLAM 系统,参见论文:

Usenko, Vladyslav, Nikolaus Demmel, and Daniel Cremers. “The Double Sphere Camera Model.” In 2018 International Conference on 3D Vision (3DV), 552–60. Verona: IEEE, 2018. https://doi.org/10.1109/3DV.2018.00069.

上述这些模型都可以归为“参数化模型”,因为它们都是使用带有少量参数的模型去拟合整张图像上全部像素点的畸变。比如 KB 模型的投影函数为:
π ( x ) = [ f x d ( θ ) x r f y d ( θ ) y r ] + [ c x c y ] , r = x 2 + y 2 , θ = a t a n 2 ( r , z ) , d ( θ ) = θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 \begin{aligned} \pi(\bold{x}) =& \begin{bmatrix} f_xd(\theta)\frac{x}{r} \\ f_yd(\theta)\frac{y}{r} \end{bmatrix} + \begin{bmatrix} c_x \\ c_y \end{bmatrix} , \\ r =& \sqrt{x^2+y^2}, \\ \theta =& atan2(r, z), \\ d(\theta) =& \theta + k_1 \theta^3+k_2 \theta^5+k_3 \theta^7+k_4 \theta^9 \end{aligned} π(x)=r=θ=d(θ)=[fxd(θ)rxfyd(θ)ry]+[cxcy],x2+y2 ,atan2(r,z),θ+k1θ3+k2θ5+k3θ7+k4θ9
只用四个参数 (k1~k4) 便能计算图像上任意一个点的畸变。

非参数化畸变模型

所谓非参数化模型并不是说没有参数,而是相对于参数化模型,它们会使用大量的参数去表示整张图的畸变。最极端的情况是每个像素点都有一组参数表示其畸变,即直接记录每一个点从带畸变图像到无畸变图像的映射(或者反过来的映射)。所以,OpenCV 中的 initUndistortRectifyMap 函数生成的映射表就可以理解为非参数化畸变模型的参数表。

显然,非参数化模型是参数化模型的拓展,它具有最大的灵活性,理论上能够用于拟合任意相机畸变。但同时越 General 的模型越容易过拟合,想要达到比较良好去畸变效果,非参数化模型需要的标定数据比参数化模型要多得多。

为了降低标定的难度,本文开头提到的论文提出了一种较为稀疏的非参数化模型:
插值
如上图所示,整个带畸变图像按照固定尺寸被划分为小的 Grid,每个 Grid 只有一个控制点,对应于一组畸变参数,即该控制点坐标到无畸变图像坐标的映射。对任意点进行去畸变操作时,先找到其周围 4×4 个控制点,然后使用基于B样条的双立方插值获得当前点的畸变参数,从而映射到无畸变坐标。

由于模型参数保存的是带畸变坐标到无畸变坐标的映射,这一方法能够很容易地实现点的去畸变 (对应 unproject 过程),但点的加畸变(对应 project 过程)却需要迭代才能实现。

关键代码

论文作者开源的代码是一个非常庞大的工程,甚至非线性优化求解器都实现了一遍。如果只是想了解并使用非参数化畸变模型,重点关注这几个文件即可:

  • applications/camera_calibration/src/camera_calibration/b_spline.h
    清晰的插值计算过程
  • applications/camera_calibration/src/camera_calibration/models/central_generic.cc
    标定相关的各种函数,包含 project、unporject、fitToModel 等
  • applications/camera_calibration/generic_models/src/central_generic.h
    应用相关的各种函数,包含 project、unproject、save、load 等
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值