如何将镜头失真模型中的镜头不失真转换为opencv?

时间:2017-05-12 17:11:54

标签: c++ algorithm opencv opencv3.0 distortion

因此OpenCV undistort将两个数组double k[6], p[2];作为参数,但是当您无法访问摄像机(仅限于其帧)时,设置它们会很复杂。有一个algorithm called Algebraic Lens Distortion Model Estimation可以在一个帧上绘制图片和手绘线条,并产生一个undistorted image。 它的输出可能如下所示:

  

(Emin,Vmin,D)=(9.7709e + 05,8.3106e + 00,8.2942e + 00)

     

失真参数:k [0] = 8.549082532748524e-01 k 1 =   0.000000000000000e + 00 k 2 = 3.217447043912507e-08 k 3 = 0.000000000000000e + 00 k 4 = 1.407606498960670e-12

     

失真中心(x0,y0)=(655.091196,385.002911)

因此我们从k数组中获得了5个项目,而p中没有任何项目。我在他们的文章中看不到p的提及。所以我想知道如何将他们的输出映射到opencv?

不适用于this images的代码示例:

#include <iostream>
#include <opencv2/world.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;

int main() {
    Mat result;
    auto in = imread("test.png"); // http://demo.ipol.im/demo/ags_algebraic_lens_distortion_estimation/archive/?key=1C3EFA932C69EE5A1254458F6F9F2B87
    int fov = 60;
    //Center of distortion (x0,y0)
    auto x = 640.000000;
    auto y = 360.000000;
    // http://answers.opencv.org/question/17076/conversion-focal-distance-from-mm-to-pixels/?answer=17180#post-id-17180
    auto focalLengthX = x / tan(fov * 0.5 * acos(-1) / 180.0);
    auto focalLengthY = y / tan(fov* 0.5 * acos(-1) / 180.0);
    cv::Mat camera_matrix = (cv::Mat_<double>(3, 3) << focalLengthX, 0, x, 0, focalLengthX, y, 0, 0, 1);

    // https://stackoverflow.com/a/34024057/1973207 
    double k[5];
    k[0] = 8.648648537891959e-01;
    k[1] = 0.000000000000000e+00;
    k[2] = 8.319218976751903e-08;
    k[3] = 0.000000000000000e+00;
    k[4] = 9.568850206942498e-13;
    Mat distortionCoefficients = (Mat1d(1, 8) << k[0], k[1], 0, 0, k[2], k[3], k[4], 0);

    undistort(in, result, camera_matrix, distortionCoefficients);
    imshow("test", result);
    waitKey();
    cin.get();
    return 0;
}

结果是:

enter image description here

而非期望: enter image description here

建议否定k[0]给出:enter image description here

2 个答案:

答案 0 :(得分:0)

通过快速阅读本文,他们提出了一种确定径向畸变的新方法。这是k_N参数。 切向失真是p参数,不考虑那里。

请试试,设置p1 = 0和p2 = 0,结果向量应为:

k1,k2,0,0,k3,k4 ...... 如果论文为相机提出了完全不同的失真模型,它将无法工作。

http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html 失真参数应与opencv中的相同。 kc(3)和kc(4)是p1和p2

答案 1 :(得分:0)

此方法不是计算切向因数,而是找到校正后的中心。运行提供的ANSI C程序,并假设中心在图像的中点开始,程序将找到真正的中心。原始估计为344253,校正后的中心为347259。知道校正后的中心似乎消除了应用切向校正的必要性。