当前位置:网站首页>非参数化相机畸变模型简介
非参数化相机畸变模型简介
2022-04-23 05:47:00 【mightbxg】
最近在看相机畸变模型相关的论文,其中有个叫非参数化模型的比较有意思:
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 等
版权声明
本文为[mightbxg]所创,转载请带上原文链接,感谢
https://blog.csdn.net/mightbxg/article/details/118797042
边栏推荐
- GDB debugger installation and use
- Record the installation and configuration of gestermer on TX2, and then use GST RTSP server
- Rust: Tcp 服务器与客户端的一个简单例子
- [leetcode 290] word rules
- [leetcode 401] binary Watch
- for()循环参数调用顺序
- Detailed arrangement of knowledge points of University probability theory and mathematical statistics
- Rust 中的 Rc智能指针
- The onnx model of yolov5 removes the transfer layer
- ThreadLocal. Threadlocalmap analysis
猜你喜欢
The most practical chrome plug-in
Substring Inversion (Easy Version)
SQL sorts according to the specified content
[untitled] database - limit the number of returned rows
基于pygame库编写的五子棋游戏
C#中?的这种形式
【UDS统一诊断服务】四、诊断典型服务(3)— 读故障信息功能单元(存储数据传输功能单元)
1007 go running (hdu6808) in the fourth game of 2020 Hangzhou Electric Multi school competition
ArcGIS表转EXCEL超出上限转换失败
【无标题】
随机推荐
Robocode教程7——雷达锁定
Motor and drive (Qi Jinqing Edition)
程序設計訓練
P1018 maximum product solution
Export the articles written in CSDN to PDF format
Explanation of the second I interval of 2020 Niuke summer multi school training camp
GNU EFI header file
Mysql database foundation
[leetcode 67] sum of two binary numbers
Storing inherited knowledge in cloud computing
Rust 中的 RefCell
批量导出Arcgis属性表
Basemap库绘制地图
Rust的闭包类型(Fn, FnMut, FnOne的区别)
Object转Json差异之Gson fastJson jackson 修改字段名
H. Are You Safe? Convex hull naked problem
渔网道路密度计算
[leetcode 401] binary Watch
生成验证码
Installation and usage skills of idea