Как перевести искажение линзы из модели искажения линзы в opencv?

Так OpenCV неискаженный принимает в качестве аргументов два массива double k[6], p[2]; но их сложно настроить, когда у вас нет доступа к камере (только к ее кадрам). Есть алгоритм называется Оценка модели искажения алгебраической линзы который берет в кадре изображение и нарисованные от руки линии и создает неискаженное изображение.
Его вывод может выглядеть так:

(Эмин, Vmin, D) = (9,7709e + 05, 8,3106e + 00, 8,2942e + 00)

Параметры искажения: k [0] = 8,549082532748524e-01 k1 знак равно
0.000000000000000e + 00 k2 = 3.217447043912507e-08 k3 = 0.000000000000000e + 00 k4 = 1.407606498960670e-12

Центр искажения (x0, y0) = (655.091196, 385.002911)

Таким образом, мы получили 5 предметов из k массив и ни один из p, И я не вижу упоминания о p в их статье. Поэтому мне интересно, как отобразить их вывод на opencv?


Пример кода, который не работает для это изображения:

#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;
}

Это приводит к:

введите описание изображения здесь

вместо желаемого:
введите описание изображения здесь


Как предложил отрицать k[0] дает:введите описание изображения здесь

1

Решение

Благодаря быстрой обработке бумаги, они предлагают новый способ определения радиального искажения. Это параметры 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector