因此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;
}
结果是:
答案 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。知道校正后的中心似乎消除了应用切向校正的必要性。