opencv - 镜头畸变模型与校正模型

标签 opencv image-processing computer-vision camera-calibration

lens model in OpenCV是一种扭曲模型,它将理想位置扭曲为相应的真实(扭曲)位置:

  • x_corrected = x_distorted ( 1 + k_1 * r^2 + k_2 * r^4 + ...),
  • y_corrected = y_distorted ( 1 + k_1 * r^2 + k_2 * r^4 + ...),

其中 r^2 = x_distorted^2 + y_distorted^2 在归一化图像坐标中(为简单起见省略了切向失真)。这也可以在 Z. Zhang 中找到:“A Flexible New Technique for Camera Calibration”,TPAMI 2000,以及 Bouguet 的“Camera Calibration Toolbox for Matlab”。

另一方面,Bradski 和 Kaehler:“学习 OpenCV”在第 376 页中介绍了透镜模型作为校正模型,它将扭曲的位置校正到理想位置:

  • x_distorted = x_corrected ( 1 + k'_1 * r'^2 + k'_2 * r'^4 + ...),
  • y_distorted = y_corrected ( 1 + k'_1 * r'^2 + k'_2 * r'^4 + ...),

其中标准化图像坐标中的 r'^2 = x_corrected^2 + y_corrected^2。 Hartley 和 Zisserman:“Multiple View Geometry in Computer Vision”也描述了这个模型。

我了解校正模型和失真模型在实践中各有利弊。例如,前者使检测到的特征点位置的校正变得容易,而后者则使整个图像的失真变得简单。

我的问题是,为什么它们共享相同的多项式表达式,而它们应该是彼此的倒数?我可以找到 this document评估可逆性,但我不清楚其理论背景。

感谢您的帮助。

最佳答案

我认为简短的回答是:它们只是不同的模型,所以它们不应该是彼此的倒数。就像您已经写过的那样,每个都有自己的优点和缺点。

至于可逆性,这取决于多项式的阶数。二阶(二次)多项式很容易反转。四阶需要更多的工作,但仍然可以分析倒置。但是一旦添加了 6 阶项,您可能不得不求助于数值方法来求逆,因为 5th-order or higher polynomial在一般情况下是解析不可逆的。

关于opencv - 镜头畸变模型与校正模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39671107/

相关文章:

python - 如何在将 dicom 文件转换为 jpg 文件时设置窗口宽度和窗口中心

C++ Dlib load_image_dataset 问题

python - 在 Python 中实现任意图像算法时处理边界像素的有效方法

machine-learning - 如何从实时视频流中提取一组固定帧用于 PyTorch 中的机器学习预测?

python - 在 Tensorflow 中微调深度神经网络

opencv - 如何计算两个相机之间的旋转和平移?

c++ - OpenCV VideoCapture::get(CV_CAP_PROP_POS_MSEC) 返回 0

opencv - 使用 OpenCV 4.2.0 进行立体声整流

python - 使用 OpenCV 去除孤立像素

python - 使用Dlib/python检测额头点