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

标签 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)这是一种“非线性求解算法(例如牛顿法、Levenberg-Marquardt 算法等)”。从我所看到的情况来看,至少有几种可能的解决方案可以解决这种不失真的问题。


问题:

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

最佳答案

它使用 false position (“regula falsi”)方法。无论失真参数的选择如何(甚至“物理上合理”参数的每种选择),我都没有看到序列收敛于这个特定方程的证据。为一些特殊情况编写一个非常容易,例如物理纯二阶桶形失真。

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

关于algorithm - cv::undistortPoints() - 迭代算法解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31184972/

相关文章:

java - OpenCV 中相机捕获的图像为全黑

java - 如何使用 java 或 scala 处理大文件的最后一 block

openCV RunningAvg 实现

python - 如何清理这张图片(opencv-python)?

c++ - 图像处理术语 : Bit Depth

matlab - 找到阴影检测的最大轮廓

c++ - 使用外力时确定球体与平面之间的静止接触

c - 在 C 中通过指针为结构中的变量赋值

算法引用

algorithm - 图像处理-人脸皱纹去除算法