cv :: undistortPoints() - 迭代算法解释

时间:2015-07-02 12:40:54

标签: algorithm opencv image-processing computer-vision coordinate-transformation

我试图了解OpenCV的背后的逻辑cv :: undisortPoints()'迭代逼近算法。

实施可在以下网址获得: https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/undistort.cpp(第361-368行)。

我看待它的方式:

  • 使用最后猜测的最佳像素位置(x,y),尝试通过在当前最佳猜测时应用“失真”的倒数来找到更好的猜测,并根据初始失真位置调整像素位置(x0,y0)
  • 使用初始扭曲位置(x0,y0)作为第一个最佳猜测'

但以上并没有真正说明为什么这可以做到......

其中一位用户发布了这里(Understanding of openCV undistortion),这是一种非线性求解算法(例如Newton'方法,Levenberg-Marquardt算法等)&# 34 ;.从我所看到的,至少有一些可能的解决方案可以解决这种无法解决的问题。

问题:

  • 在cv :: undistortPoints()中实现了什么迭代算法完全
    • 是否有任何白皮书显示(以及[更重要的是]解释'就像我在其背后的想法一样?
  • 我们怎么知道这个算法会收敛(至少是局部最小值)?
  • 为什么我们要对初始位置(x0,y0)进行修正?

1 个答案:

答案 0 :(得分:1)

它使用false position(“regular falsi”)方法。我没有看到这个特定方程的序列收敛的证据,无论失真参数的选择(甚至是“物理上可信的”参数的每个选择)。为一些特殊情况写一个,例如,物理纯二阶桶形失真。

在实践中它似乎运作良好。如果您对它感到不舒服,可以随时更换您选择的方程求解器。对于任何阶数的纯径向失真(即,使用单个未知数),您可以使用任何多项式方程求解器,例如,老旧的SLATEC rpqr79