gpt4 book ai didi

c++ - OpenCV3.0.0dev中鱼眼相机模型的主要引用有哪些?

转载 作者:IT老高 更新时间:2023-10-28 22:26:57 30 4
gpt4 key购买 nike

我正在与 OpenCV 3.0.0.dev 中使用的 鱼眼相机模型 搏斗。我已阅读此 link 中的文档几次,尤其是“详细说明”部分和鱼眼失真建模公式。到目前为止,我有两个担忧:

  1. 基于列出的投影模型 here以及他们在休斯的“鱼眼镜头模型的准确性”中的概念解释,我无法弄清楚 OpenCV 实现中使用了哪个投影模型

  2. 由于描述如此简洁,我需要了解 OpenCV 开发人员用于实现鱼眼命名空间的主要引用论文,以便我能够准确无误地通过更多细节。附言我检查了 OpenCV 3.0.0-dev 文档,没有发现任何有用的东西。

最佳答案

简答:

OpenCV 3.0.0 鱼眼相机模型不使用 Brown 模型,也不使用 OP 从 Panotools 引用的任何模型,它使用 Juho Kannala 和 Sami S. Brandt 的通用相机模型。

详细解答:

正如 Cfr 在他的回答中指出的那样,this comment来自 Ilya Krylov(在 OpenCV 中实现鱼眼模型)说他们移植了 Jean-Yves Bouguet 的 Camera Calibration Toolbox for Matlab:

Snapshot of the comment

Jean-Yves Bouguet 网站 (link) 反过来提到了论文 A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses ,并说:

The "undocumented" fisheye model contained in the calibration toolbox follows the equidistance projection model described by equation (3) in this very nice paper. The distortion model follows equation (6), to the exception that k1=1 (otherwise indistinguishable from f).

在我看来这是一种误导性陈述或明显的误解,因为等式 (3) 和等式 (6) 对应于不同的模型:等式 (6) 是本文中引入的实际模型,作者将其称为 通用相机模型(因此得名)。更准确地说,方程(6)是用来作为相机模型的,方程(8)和(9)是作为“失真”或偏离这个模型的。

但奥德赛还没有结束。 OpenCV 的实现(根据其 documentation)首先计算针孔投影以找到视场角(3D 点、投影中心和光轴之间的角度)。 这意味着您不能使用他们的鱼眼模型以 90º(或者您将除以 0)或接近 90º(数值稳定性问题,例如可能发生溢出)转换光线如果 z 足够小)。此外,我不确定它是否适用于超过 90º 的光线。这一切让我真的很想知道他们的鱼眼镜头模型对于鱼眼镜头或广角镜头的“实用性”。

如果您对此持怀疑态度,可以查看 OpenCV 的源代码,具体地址为 sources\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]);
...
}

更新:This拉取请求修复了角度 ≥ 90º 的光线问题。截至 2018 年 4 月,它尚未合并到 master 中,但正在考虑用于 OpenCV 4.x Calibration Module (也请查看 calibration module discussion)

关于c++ - OpenCV3.0.0dev中鱼眼相机模型的主要引用有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089265/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com