相机模型-鱼眼模型(fisheye camera model)

article/2025/10/5 7:52:35

鱼眼相机模型 (fisheye camera model)

  • 模型介绍
    • 等距投影
    • 等立体角投影
    • 正交投影
    • 体视投影
    • 线性投影
  • Kannala-Brandt 模型
    • 去畸变过程
    • 投影过程
    • 反投影过程
  • 雅可比计算

之前总结了一下针孔相机的模型,然后得到了比较积极的回复(其实是我到处求人关注的,虽然截至到目前才三个人),所以就再接再励,乘胜追击(也没得办法,夸下的海口,跪着也要做完),继续总结其他相机模型。

模型介绍

鱼眼相机相较于针孔相机来说,视野更广,但畸变也更加严重,因此普通的针孔模型已不适用。鱼眼镜头的基本构造如图所示,经过多个镜头的折射,最终到达成像单元上。文章中所有图片均来自于网络,非本人所绘。
在这里插入图片描述
一般情况下,可以通过控制光线的路径来设计各种各样的镜头类型,根据投影方式的不同,可以将这些镜头分为等距投影、等立体角投影、正交投影、体视投影以及线性投影。
在这里插入图片描述在这里插入图片描述

等距投影

r = f θ r=f \theta r=fθ

等立体角投影

r = 2 f s i n ( θ 2 ) r=2fsin({{\theta} \over {2}}) r=2fsin(2θ)

正交投影

r = f s i n ( θ ) r=fsin(\theta ) r=fsin(θ)

体视投影

r = 2 f t a n ( θ 2 ) r=2ftan({{\theta} \over {2}}) r=2ftan(2θ)

线性投影

r = f t a n ( θ ) r=ftan(\theta) r=ftan(θ)

Kannala-Brandt 模型

同针孔模型一样,鱼眼模型也有畸变,那么怎么来用数学鱼眼描述这种畸变呢?观察各种投影方式,发现他们都是一个关于入射角 θ \theta θ 的奇函数,因此鱼眼镜头的畸变也是对 θ \theta θ 的畸变,KB模型用只包含奇次项的多项式来描述畸变过程,其具体形式如下所示
θ d = θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 \theta_d=\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9 θd=θ+k1θ3+k2θ5+k3θ7+k4θ9
opencv中使用的鱼眼相机畸变模型就是这个模型,该模型适用于大多数鱼眼相机。另外,也可以用这种模型来对普通的针孔相机模型进行标定,仔细观察,上述的线性投影实际就是普通的针孔投影模型。最后鱼眼相机的投影模型可以表示为
r = f θ d r = f \theta_d r=fθd
其中 r r r表示图像中像素点到主点的距离。

去畸变过程

对于鱼眼相机的去畸变过程可以采用解析的方式,因为从上述畸变公式中可以看到,畸变模型是一个多项式,理论上是存在解析解的。但本人使用的方法和针孔模型中类似,通过优化的方法进行去即便,代码如下

      template<typename DERIVED_P>void undistort(const Eigen::MatrixBase <DERIVED_P> &p_d,const Eigen::MatrixBase <DERIVED_P> &p_ud) const{EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE_OR_DYNAMIC(Eigen::MatrixBase<DERIVED_P>, 2)Eigen::MatrixBase<DERIVED_P> &y_ud = const_cast<Eigen::MatrixBase<DERIVED_P> &>(p_ud);Eigen::MatrixBase<DERIVED_P> &y_d = const_cast<Eigen::MatrixBase<DERIVED_P> &>(p_d);y_ud.derived().resize(2);y_d.derived().resize(2);struct MLFunctor{MLFunctor( const Eigen::Vector2d &imagePoint, double k1, double k2, double k3, double k4 ): imagePoint_(imagePoint), _k1(k1), _k2(k2), _k3(k3), _k4(k4){}int operator( )( const Eigen::VectorXd &x, Eigen::VectorXd &fvec ) const{double theta = x[0];double phi = x[1];double theta2 = theta * theta;double theta4 = theta2 * theta2;double theta6 = theta4 * theta2;double theta8 = theta4 * theta4;double thetad = theta * ( 1 + _k1 * theta2 + _k2 * theta4 + _k3 * theta6 + _k4 * theta8);fvec[0] = thetad;fvec[1] = phi;fvec = fvec - imagePoint_;return 0;}int df( const Eigen::VectorXd &x, Eigen::MatrixXd &fjac ) const{double theta = x[0];double theta2 = theta * theta;double theta4 = theta2 * theta2;double theta6 = theta4 * theta2;double theta8 = theta4 * theta4;fjac(0, 0) = 9 * _k4 * theta8 + 7 * _k3 * theta6 + 5 * _k2 * theta4 + 3 * _k1 * theta2 + 1;fjac(0, 1) = 0;fjac(1, 0) = 0;fjac(1, 1) = 1;return 0;}int values() const { return 2; }int inputs() const { return 2; }Eigen::Vector2d imagePoint_;double _k1;double _k2;double _k3;double _k4;};Eigen::Vector2d target = y_d;MLFunctor func( target, m_k1, m_k2, m_k3, m_k4 );Eigen::LevenbergMarquardt< MLFunctor > lm(func);double theta = y_d[0];double phi = y_d[1];Eigen::VectorXd res = Eigen::Vector2d(theta, phi);lm.minimize(res);y_ud = res;}

投影过程

  1. 给定相机坐标系下一点 P c = ( x , y , z ) P_c=(x, y, z) Pc=(x,y,z)
  2. 归一化到球平面上 P s = P c ∣ ∣ P c ∣ ∣ = ( x s , y s , z s ) P_s = {{P_c} \over {||P_c||}}=(x_s, y_s,z_s) Ps=PcPc=(xs,ys,zs)
  3. 求经纬度 θ = a c o s ( z s ) = a t a n 2 ( x 2 + y 2 ) , z ) \theta=acos(z_s)=atan2(\sqrt{x^2+y^2)}, z) θ=acos(zs)=atan2(x2+y2) ,z), ϕ = a t a n 2 ( y s , x s ) \phi=atan2(y_s, x_s) ϕ=atan2(ys,xs)
  4. 利用畸变模型对 θ \theta θ进行加畸变处理,得到 θ d \theta_d θd
  5. 最后得到该点在图像中的像素坐标 u = f x θ d x c r + c x u={{f_x\theta_d x_c}\over r } +cx u=rfxθdxc+cx, v = f y θ d y c r + c y v={{f_y\theta_d y_c}\over r } +cy v=rfyθdyc+cy, r = x c 2 + y c 2 r=\sqrt{x_c^2 + y_c^2} r=xc2+yc2

反投影过程

  1. 给定图像上一点 p = ( u , v ) p=(u, v) p=(u,v).
  2. 可以得到归一化坐标 p d = ( x , y ) = ( u − c x f x , v − c y f y ) p_{d} = (x, y) = ({{u - cx} \over f_x}, {{v - cy} \over f_y}) pd=(x,y)=(fxucxfyvcy)
  3. 可以得到带畸变的入射角 θ d = x 2 + y 2 , ϕ = a t a n 2 ( y , x ) \theta_d=\sqrt{x^2+y^2}, \phi=atan2(y, x) θd=x2+y2 ,ϕ=atan2(y,x).
  4. 去畸变后得到 θ \theta θ.
  5. 最后得到单位球面坐标 x = s i n ( θ ) c o s ( ϕ ) , y = s i n ( θ ) s i n ( ϕ ) , z = c o s ( θ ) x = sin(\theta)cos(\phi), y=sin(\theta)sin(\phi), z = cos(\theta) x=sin(θ)cos(ϕ),y=sin(θ)sin(ϕ),z=cos(θ)

雅可比计算

多数情况下,都用BA算法来计算相机的内外参,这就需要知道雅可比矩阵,即投影误差对各待优化变量的偏导数组成的矩阵。所谓的投影误差,实际检测到点与投影到图像上的点之间的误差
e r r = p m − p err=p_m - p err=pmp
其中 p m p_m pm表示检测到的角点。为了避免手撕公式,我使用了matlab直接来推导出结果,并且在推导公式时,没有考虑畸变项,因为公式太长了,懒得敲。
代码:

syms fx fy x y z cx cy k1 k2 k3 k4R = sqrt(x^2 + y^2 + z^2);
xc = x / R;
yc = y / R;
zc = z / R;
theta = acos(z);
%thetad = theta + k1 * theta^3 + k2 * theta^5 + k3 * theta^7 + k4 * theta^9;
thetad = theta;
r = sqrt(xc^2 + yc^2);
u = fx * (thetad * xc) / r + cx;
v = fy * (thetad * yc) / r + cy;alphaE_alphaK = - [diff(u, fx), diff(u, fy), diff(u, cx), diff(u, cy);diff(v, fx), diff(v, fy), diff(v, cx), diff(v, cy)]alphaE_alphaP = -[diff(u, x), diff(u, y), diff(u, z);diff(v, x), diff(v, y), diff(v, z)]
alphaP_alphaR = [1, 0, 0, 0, z, -y; 0, 1, 0, -z, 0, x; 0, 0, 1, y, -x, 0]alphaE_alphaP * alphaP_alphaR

假设相机坐标系下归一化到球面的3D点坐标坐标为 P s = ( x s , y s , z s ) P_s=(x_s, y_s, z_s) Ps=(xs,ys,zs)

  1. 误差项关于内参的偏导数
    在这里插入图片描述
    其中 r = x s 2 + y s 2 r=\sqrt{x_s^2 + y_s^2} r=xs2+ys2 , θ = a c o s ( z s ) \theta=acos(z_s) θ=acos(zs)

  2. 误差项关于相机坐标系下点 P s P_s Ps的偏导
    在这里插入图片描述
    其中 r = x s 2 + y s 2 r=\sqrt{x_s^2 + y_s^2} r=xs2+ys2 , θ = a c o s ( z s ) \theta=acos(z_s) θ=acos(zs)

  3. 误差项在李代数上的扰动模型
    根据链式法则可得

∂ e r r ∂ δ ξ = ∂ e r r ∂ P s ∂ P s ∂ δ ξ {{\partial err} \over {\partial \delta \xi }} = {{\partial err} \over {\partial {P_s}}}{{\partial {P_{\rm{s}}}} \over {\partial \delta \xi }} δξerr=PserrδξPs

其中, ∂ P c ∂ δ ξ {{\partial {P_{\rm{c}}}} \over {\partial \delta \xi }} δξPc的推导后续会有专门篇幅进行总结,在这个先用起来再说。
在这里插入图片描述
其中 r = x s 2 + y s 2 r=\sqrt{x_s^2 + y_s^2} r=xs2+ys2 , θ = a c o s ( z s ) \theta=acos(z_s) θ=acos(zs)


http://chatgpt.dhexx.cn/article/UtrqGrfa.shtml

相关文章

opencv fisheye calibration(鱼眼相机校正)

文章目录 fisheye_calibration小孔成像模型&#xff08;理想相机成像模型&#xff09;fisheye model 相机模型内参校正的原理calibration过程对这个过程简单分析参考文章 fisheye_calibration 小孔成像模型&#xff08;理想相机成像模型&#xff09; 请参考下面的文章 理想相…

【论文】RAPiD: Rotation-Aware People Detection in Overhead Fisheye Images

RAPiD: Rotation-Aware People Detection in Overhead Fisheye Images 在这项工作中&#xff0c;我们开发了一种端到端的旋转感知的人检测方法&#xff0c;称为RAPID&#xff0c;它使用任意方向的包围盒来检测人。我们的完全卷积神经网络使用周期损失函数直接回归每个包围盒的…

fisheye calib视野调整

1. 畸变模型采用 K np.array([[6.2597563231075685e02, 0., 1.1601088601848592e03],[0., 6.2525998102575511e02, 1.1634786618991664e03],[0., 0., 1.]]) 2. 直接使用 initUndistortRectifyMap和remap时注意调节视野的大小&#xff0c;为了方便得到想要的大小需要借助 es…

初识FishEye

一、简介 这几个月一直都在整白盒测试&#xff0c;虽然断断续续&#xff0c;但是也确实学习了不少东西&#xff0c;长了不少见识。今天就要给大家隆重介绍一款非常棒的工具——FishEye&#xff01; FishEye能够为你打开代码库&#xff0c;并帮助你分析代码&#xff0c;一句话概…

FishEye简介

前言 在项目开发过程中&#xff0c;随着开发的进行&#xff0c;将有大量的代码编写提交到代码仓库&#xff0c;如何能全面准确的了解源代码的变化&#xff0c;提交的频率&#xff0c;代码量的趋势&#xff0c;发现代码的缺陷&#xff0c;将是控制源代码质量的重要指标&#xff…

linux服务器开机提示f1,Dell的Linux服务器开机按F1解决方法

最近买了些二手服务器&#xff0c;dell品牌&#xff0c;性价比还不错&#xff0c;但是一台dell 服务器开机总是提示按F1才能进系统,到底应该怎么解决呢&#xff1f; 请问我的电脑开机老是提示“strike the f1 key to continue &#xff0c;f2 to run the setup utility”这些&a…

服务器开机显示f1 f2,开机提示按F1/F2才能进入系统的解决方法

电脑开机出现了一个怪现象&#xff0c;那就是每次开机的时候都会有“F1”或者是“F2”的提示&#xff0c;并且要按一下才能正常进入系统&#xff0c;该怎么解决呢&#xff1f;下面秋叶系统小编教大家解决办法&#xff01; 下图为开机按F1键才能正常进入系统的画面&#xff01; …

联想计算机启机按F1,电脑开机提示按f1不能正常启动怎么办

电脑开机一般都是自动启动,不过有时出现提示要按f1,否则不能正常启动,怎么回事呢?不知道的朋友可以看看以下关于开机提示F1的解决方法,希望对你有帮助! 电脑开机提示按f1的解决方法 启动电脑需要按F1才能进入系统解决方法:开机时要按F1这是BIOS设置错误引起的,所以可能是…

DELL服务器重启以后需要按F1才能进去系统

1、DELL服务器断电以后启动会一直卡在这个页面&#xff0c;需要手动按F1才能进入系统&#xff0c;解决方法如下&#xff1a; 2、按F2进入到"for System Setup (BIOS)" 3、进入到&#xff1a;system BIOS 4、进入到&#xff1a;Miscellaneous Settings 5、设置 F1…

计算机开机按f1f2,电脑开机总是提示按f1 f2问题的解决办法

一、问题描述 开机后出现如下图界面,无法进入系统。 我们看最后两条: 尝试按F1,可以进入了BIOS, 而按F2却一直卡着,无法进入系统,一会之后又自动关机。 其实这是某品牌主板的通病,特别是一些低端的主板。在我们开机后,一直会出现CMOS Checksum Bad 提示按F1 F2的问题。…

技嘉服务器主板按f1才能进系统,电脑开机要按F1或F2才能进入系统的解决方法

有些电脑有段时间没用&#xff0c;开机后发现进不到系统&#xff0c;显示如下图&#xff0c;必须按F1或者F2才能进入系统&#xff0c;虽然每次也能进入系统&#xff0c;但感觉很烦&#xff0c;这是什么原因呢&#xff1f;下面分享两个电脑开机要按F1或F2才能进入系统的解决方法…

服务器启动显示按f1f2f10,电脑开机提示按f1f2f5 电脑开机要按F1F2F5

电脑开机要求按F1&#xff0c;F2&#xff0c;F3或F5 有朋友跟我反应说他的XP系统&#xff0c;开机的时候要手动按F1才可以进WIN程序。那怎么改成默认的呢&#xff1f;可以尝试下以下方法。方法一、开启计算机或重新启动计算机后&#xff0c;及时按下“Del”键进入BIOS的设置界面…

电脑开机,总需要按F1,是什么原因造成的?

开机需要按F1键,原因有好几个,最常见的是BIOS电池没有电了,更换一块电池即可。 一、什么是BIOS电池 BIOS电池也叫主板电池,位置在主板上面,打开机箱盖子就可以看到啦,样子就是圆圆的一个银币一样的,很好看。 BIOS电池其实和电子秤、电视遥控器里的电池是一样的,一般…

华硕主板开机提示按F1怎么办?华硕主板开机提示按F1的解决方法

最近有很多网友问我的电脑采用的是华硕主板&#xff0c;不过最近在进入黑苹果后再开机出现了F1键&#xff0c;想要在BIOS中关闭F1报错检测&#xff0c;不知道如何操作。开机需要按下F1键&#xff0c;通常这种问题并非是致命性故障&#xff0c;可以直接在主板中关闭。那么华硕主…

按F1才能进系统怎么办?电脑开机需要按f1才能进入系统的解决办法

经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…

计算机开机按f1,开机要按F1怎么解决?电脑开机不按F1进去系统的方法

相信很多用户在开启电脑的时候都会这种情况&#xff0c;开机的时候电脑要按F1才能进入系统&#xff0c;如果不按F1就进不了系统桌面。时间长了&#xff0c;会让人非常厌烦。那么要如何设置不按F1就直接进入系统桌面呢&#xff1f;下面就和大家介绍一下电脑开机不按F1直接进去系…

服务器开机显示f1 f2,开机按f1的解决方法|开机按f2的解决方法|电脑开机按f1怎么解决...

2013-12-24 09:55:09  浏览量:1036 相信很多用户都有遇到一个问题,即开机时会出现一大串英文:Hareware Monitor found an error,enter POWER MANAGEMENT SETUP for details,Press F1 to continue,DEL to enter SETUP,提示让你按F1才能继续启动计入系统。 2018-11-25 1…

台式计算机启动时 每次按f1,电脑开机时总是提示要按F1?云骑士告诉你如何解决...

原标题&#xff1a;电脑开机时总是提示要按F1&#xff1f;云骑士告诉你如何解决 电脑开机要按F1的原因及解决办法。想必大家都有遇到过开机要按F1&#xff0c;那这是什么原因呢?如何解决这个问题&#xff1f;下面云骑士来详细介绍下遇到这种问题的原因和解决方法! 电脑开机要按…

计算机开机总要按f1键,为什么开机要按f1键?win7每次开机按f1才能进入系统怎么办...

很多小伙伴遇到电脑每次开机都要按f1才能进入win7旗舰版系统&#xff0c;怎么回事&#xff1f;这说明你电脑的bios里面启动项没有设置好。因为没有设置好&#xff0c;所以就按F1才能能引导你的系统启动。为此&#xff0c;下面给大家讲解win7每次开机按f1才能进入系统的解决方法…