mas*_*sih 16 c++ opencv fisheye camera-calibration opencv3.0
我正在与OpenCV 3.0.0.dev中使用的鱼眼相机模型搏斗.我已多次阅读此链接中的文档 ,尤其是"详细说明"部分和鱼眼失真模型.到现在为止,我有两个问题:
亲切的问候,
马希赫
M. *_*dez 18
OpenCV 3.0.0 Fisheye相机型号不使用Brown型号,也不使用OP从Panotools引用的任何型号,它使用Juho Kannala和Sami S. Brandt的Generic Camera Model.
正如CFR在他的回答指出,此评论从伊利亚克雷洛夫(谁实施了OpenCV的鱼眼模式)说,他们移植的摄像机标定工具箱Matlab的吉恩·伊夫·博格特的:

Jean-Yves Bouguet网站(链接)反过来提到了传统,广角和鱼眼镜头的通用相机模型和校准方法,并说:
包含在校准工具箱中的"未记录的"鱼眼模型遵循在这篇非常好的论文中由等式(3)描述的等距投影模型.失真模型遵循等式(6),除了k1 = 1(否则与f无法区分).
在我看来,这是误导性的陈述或明显的误解,因为等式(3)和等式(6)对应于不同的模型:等式(6)是本文中引入的实际模型,作者将其称为通用相机模型(因此这篇论文的名字).更确切地说,等式(6)用作相机模型,等式(8)和(9)用作"失真"或偏离该模型.
但是奥德赛还没有结束.OpenCV的实现(根据其文档)首先计算针孔投影以找到视场角(3D点,投影中心和光轴之间的角度).这意味着您不能使用它们的鱼眼模型将光线投射到90º(或者您将除以0)或接近90°(数值稳定性问题,如果z足够小则可能发生溢出).此外,我不确定它是否适用于超过90º的光线.所有这些让我真的很想知道他们的鱼眼镜头模型对于鱼眼镜头或广角镜头的"实用性".
如果您对此持怀疑态度,可以查看OpenCV的源代码,具体来说是来源\ modules\calib3d\src\fisheye.cpp(我添加了一些注释)
void cv::fisheye::projectPoints(InputArray objectPoints, OutputArray imagePoints, InputArray _rvec,
InputArray _tvec, InputArray _K, InputArray _D, double alpha, OutputArray jacobian)
{
...
Rodrigues(om, R, dRdom);
Affine3d aff(om, T);
...
Vec3d Xi = objectPoints.depth() == CV_32F ? (Vec3d)Xf[i] : Xd[i];
Vec3d Y = aff*Xi; /* To transform to camera reference frame*/
Vec2d x(Y[0]/Y[2], Y[1]/Y[2]); /* <- The root of all evil (division by z) */
double r2 = x.dot(x);
double r = std::sqrt(r2);
// Angle of the incoming ray:
double theta = atan(r);
double theta2 = theta*theta, theta3 = theta2*theta, theta4 = theta2*theta2, theta5 = theta4*theta,
theta6 = theta3*theta3, theta7 = theta6*theta, theta8 = theta4*theta4, theta9 = theta8*theta;
double theta_d = theta + k[0]*theta3 + k[1]*theta5 + k[2]*theta7 + k[3]*theta9;
double inv_r = r > 1e-8 ? 1.0/r : 1;
double cdist = r > 1e-8 ? theta_d * inv_r : 1;
Vec2d xd1 = x * cdist;
Vec2d xd3(xd1[0] + alpha*xd1[1], xd1[1]);
Vec2d final_point(xd3[0] * f[0] + c[0], xd3[1] * f[1] + c[1]);
...
}
Run Code Online (Sandbox Code Playgroud)
更新:此拉取请求修复角度≥90º的光线问题.截至2018年4月,尚未合并为Master,但正在考虑使用OpenCV 4.x 校准模块.
经过几个小时的阅读,我发现OpenCV的鱼眼文档中的公式?=atan(r),是r=f*tan的归一化倒数?与针孔投影有关,因此,在 OpenCV 中没有使用上述链接中提到的任何鱼眼投影模型。
另外,关于畸变模型,我猜测是使用了 Fitzgibbon 2001 年论文《多视图几何和透镜畸变的同时线性估计》中的分部模型。根据 Hughes 在 2008 年的论文“鱼眼相机几何失真补偿综述”中的说法,其他替代方案包括“奇数多项式模型”和“多项式鱼眼变换”。在他的论文第 2 页,他写道:
" (1)(指的是奇数多项式模型)和(3)(指的是除法模型,我猜这是 OpenCV 使用的模型)可用于描述标准非鱼眼镜头中的失真。然而,它一般认为这些多项式模型不足以描述鱼眼镜头引入的畸变程度。Shah 和 Aggarwal 在 [9] (Intrinsic Parameter Calibration Procedure For A High Distortion Fish-eye Lens Camera With Distortion Model And Accuracy Estimation),即使使用(1)的7阶版本来模拟鱼眼径向畸变,仍然存在相当大的畸变,以至于他们不得不使用具有更大自由度的模型。因此,可以使用同时使用奇数和偶数系数(而不是简单地使用一种或另一种)的多项式来模拟鱼眼镜头引入的径向畸变"
毕竟,我得出的结论是,OpenCV 中的鱼眼模型的适用性非常有限,在失真模型和投影模型方面可以得到更多加强。我想再次强调,我仍然需要知道 OpenCV 开发人员使用哪些论文来实现鱼眼命名空间。
我非常感谢任何人对此的评论。
| 归档时间: |
|
| 查看次数: |
8187 次 |
| 最近记录: |