cv::undistortPoints() 中实际使用的数值迭代算法是啥?
Posted
技术标签:
【中文标题】cv::undistortPoints() 中实际使用的数值迭代算法是啥?【英文标题】:What numerical iterative algorithm is actually used in cv::undistortPoints()?cv::undistortPoints() 中实际使用的数值迭代算法是什么? 【发布时间】:2019-06-03 20:20:12 【问题描述】:这个问题与openCV中undistortPoints中使用的数值方法有关,在here之前被问过:
我还有一个问题。其中一个答案指出 opencv 中的 undistortPoints 使用了假位置的方法。然而,这对我来说并不明显。
根据wikipedia,双假仓法需要两次猜测。该代码没有显示 2 次猜测,而是仅使用了一次猜测。
我也很难找到写在具有多个变量的错误位置方法上的任何内容。
任何帮助我澄清所使用的方法实际上是错误位置方法的参考资料将不胜感激。
opencv原代码可以找到here
【问题讨论】:
不就是定点法吗? 请更改标题以引用您帖子中的问题。 【参考方案1】:据我所知,Jacobi method 被应用于一组非线性方程。
在 python 中重新实现的 OpenCV 算法的总结版本可能有助于解释(请注意,为简洁起见,它仅使用失真参数 k1-k6、p1、p2):
def undistort(u, v):
x = (u - cx) / fx
y = (v - cy) / fy
x0 = x
y0 = y
for _ in range(5):
r2 = x * x + y * y
icdist = (1 + ((k6 * r2 + k5) * r2 + k4) * r2) / (1 + ((k3 * r2 + k2) * r2 + k1) * r2)
assert icdist > 0, f"icdist= <= 0"
delta_x = 2 * p1 * x * y + p2 * (r2 + 2 * x * x)
delta_y = p1 * (r2 + 2 * y * y) + 2 * p2 * x * y
x = (x0 - delta_x) * icdist
y = (y0 - delta_y) * icdist
return x, y
不要混淆 x0
和 y0
是什么。它们不是 Jacobi 方法的猜测,它们只是常量 (u - cx) / fx
和 (v - cy) / fy
,它们不依赖于 x
或 y
。话虽如此,表达式 x = (x0 - delta_x) * icdist
(以及 y
的等价物)正是您符号求解 calibration equations 的 x
后得到的结果,因此它被用于 Jacobi 迭代。
关于为什么这适用于非线性方程组,请查看this answer。基本上,该方法通常适用于“好的”非线性函数。
【讨论】:
以上是关于cv::undistortPoints() 中实际使用的数值迭代算法是啥?的主要内容,如果未能解决你的问题,请参考以下文章