我正在努力理解OpenCV的cv::unsortPoints((迭代近似算法背后的逻辑。
该实施可在以下网址获得:https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/undistort.cpp(第361-368行(。
我的看法是:
- 使用上次最佳猜测的像素位置(x,y(,尝试通过应用"当前最佳猜测下的失真"的倒数来找到更好的猜测,并根据初始失真位置(x0,y0(调整像素位置
- 使用初始扭曲位置(x0,y0(作为第一个"最佳猜测">
但以上内容并不能真正说明为什么可以这样做。。。
其中一位用户发帖称(此处:理解openCV不失真(,这是一种"非线性求解算法(例如牛顿法、Levenberg-Marquardt算法等("。从我所看到的情况来看,对于这种不失真的问题,至少有一些可能的解决方案。
问题:
- cv::undistortPoints((中究竟实现了什么迭代算法?
- 有没有白皮书展示(更重要的是(解释"就像我五岁一样"背后的想法
- 我们如何知道这个算法会收敛(至少收敛到局部最小值(
- 为什么我们要对初始位置(x0,y0(进行校正
它使用了false position("regula falsi"(方法。无论失真参数的选择如何(甚至对于每一个"物理上合理"的参数的选择(,我都没有看到序列对这个特定方程收敛的证据。为一些特殊情况编写一个非常容易,例如物理纯二阶桶变形。
在实践中,它似乎运行良好。如果你对此感到不舒服,你可以随时用你选择的方程求解器来代替。对于任何阶数的纯径向失真(即单个未知(,您可以使用任何多项式方程求解器,例如旧的SLATEC的rpqr79。