版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/electech6/article/details/101380724
本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接:代码解读 | VINS_Mono中的鱼眼相机模型
VINS_Mono代码支持的相机包括针孔模型和鱼眼模型相机,针孔模型大家都比较熟悉了,今天向大家介绍一种鱼眼相机模型——MEI模型及其标定方法。
相比针孔模型可以将3d点直接投影到归一化平面,鱼眼相机则多了一个中间过程:先将3d点投影到单位球面,再将单位球面上的点投影到归一化平面上。废话不多说,请看鱼眼相机投影模型示意图:
VINSMono中相机模型对应代码在/VINS-Mono/cameramodel/src/camera_models/CataCamera.cc文件**liftSphere**()函数中,该函数是将$2d$ 投影到$3d$ 点(单位球面上),首先对$2d$去畸变,然后再投影到单位球面上。
去畸变过程代码如下:
//去畸变过程
int n = 6;
Eigen::Vector2d d_u;
distortion(Eigen::Vector2d(mx_d, my_d), d_u);//得到畸变量
// Approximate value
mx_u = mx_d - d_u(0);
my_u = my_d - d_u(1);
for (int i = 1; i < n; i)//循环去畸变多次,使结果更接近真值
{
distortion(Eigen::Vector2d(mx_u, my_u), d_u);
mx_u = mx_d - d_u(0);
my_u = my_d - d_u(1);
}
将去畸变后的$2d$ 点投影到归一化球面代码如下:
double xi = mParameters.xi();
if (xi == 1.0)
{
lambda = 2.0 / (mx_u * mx_u my_u * my_u 1.0);
P << lambda * mx_u, lambda * my_u, lambda - 1.0;
}
else
{
lambda = (xi sqrt(1.0 (1.0 - xi * xi) * (mx_u * mx_u my_u * my_u))) / (1.0 mx_u * mx_u my_u * my_u);
P << lambda * mx_u, lambda * my_u, lambda - xi;
}
其中xi对应公式$(7)$ 中的$ xi$ 。