Я борюсь с Модель камеры «рыбий глаз» используется в OpenCV 3.0.0.dev. Я прочитал документацию в этом ссылка на сайт несколько раз, особенно «Подробное описание» части и формулы, моделирующие искажение типа «рыбий глаз». К настоящему времени у меня есть две проблемы:
С уважением,
Масих
Модель камеры OpenCV 3.0.0 Fisheye не использует модель Brown и ни одну из моделей, на которые ссылается OP от Panotools, она использует универсальную модель камеры Юхо Каннала и Сами С. Брандт.
Как ЧФР указывает в своем ответе, этот комментарий Илья Крылов (который реализовал модель «рыбий глаз» в OpenCV) говорит, что они портировали Набор инструментов для калибровки камеры для Matlab Жан-Ива Буге:
Сайт Жана-Ива Буге (ссылка на сайт), в свою очередь, упоминает бумагу Общая модель камеры и метод калибровки для обычных, широкоугольных объективов и объективов типа «рыбий глаз», и говорит:
«Недокументированная» модель «рыбий глаз», содержащаяся в наборе инструментов калибровки, соответствует модели проекции эквидистантности, описанной уравнением (3) в этой очень хорошей статье. Модель искажения следует уравнению (6), за исключением того, что k1 = 1 (в противном случае неотличимо от f).
Что, на мой взгляд, является вводящим в заблуждение утверждением или простым заблуждением, поскольку уравнение (3) и уравнение (6) соответствуют различным моделям: уравнение (6) — это фактическая модель, представленная в этой статье, которую авторы называют Универсальная модель камеры (отсюда и название статьи).
Чтобы быть более точным, уравнение (6) предназначалось для использования в качестве модели камеры, а уравнение (8) и (9) — для искажения или отклонения от этой модели.
Но одиссея еще не закончилась. Реализация OpenCV (в соответствии с его документация) сначала вычисляет проекцию с точечным отверстием, чтобы найти угол поля зрения (угол между трехмерной точкой, центром проекции и оптической осью). Это означает, что вы не можете использовать их модель «рыбий глаз» для проецирования лучей на 90º (или вы бы поделили на 0) или близко к 90º (проблемы со стабильностью чисел, такие как переполнение, могут возникнуть, если z достаточно мало).
Более того, я не уверен, будет ли он работать для лучей более чем на 90º.
Все это заставляет меня задуматься о «полезности» их моделей «рыбий глаз» для объективов «рыбий глаз» или широкоугольных объективов.
Если вы скептически относитесь к этому, вы можете взглянуть на исходный код OpenCV, конкретно на Источники \ Modules \ calib3d \ SRC \ fisheye.cpp (Я добавил несколько комментариев)
void cv::fisheye::projectPoints(InputArray objectPoints, OutputArray imagePoints, InputArray _rvec,
InputArray _tvec, InputArray _K, InputArray _D, double alpha, OutputArray jacobian)
{
...
Rodrigues(om, R, dRdom);
Affine3d aff(om, T);
...
Vec3d Xi = objectPoints.depth() == CV_32F ? (Vec3d)Xf[i] : Xd[i];
Vec3d Y = aff*Xi; /* To transform to camera reference frame*/
Vec2d x(Y[0]/Y[2], Y[1]/Y[2]); /* <- The root of all evil (division by z) */
double r2 = x.dot(x);
double r = std::sqrt(r2);
// Angle of the incoming ray:
double theta = atan(r);
double theta2 = theta*theta, theta3 = theta2*theta, theta4 = theta2*theta2, theta5 = theta4*theta,
theta6 = theta3*theta3, theta7 = theta6*theta, theta8 = theta4*theta4, theta9 = theta8*theta;
double theta_d = theta + k[0]*theta3 + k[1]*theta5 + k[2]*theta7 + k[3]*theta9;
double inv_r = r > 1e-8 ? 1.0/r : 1;
double cdist = r > 1e-8 ? theta_d * inv_r : 1;
Vec2d xd1 = x * cdist;
Vec2d xd3(xd1[0] + alpha*xd1[1], xd1[1]);
Vec2d final_point(xd3[0] * f[0] + c[0], xd3[1] * f[1] + c[1]);
...
}
Обновить: это Запрос на тягу решает проблему с лучами под углами ≥ 90º. По состоянию на апрель 2018 года он еще не был объединен с основным, но рассматривается для OpenCV 4.x Калибровочный модуль.
После нескольких часов чтения я обнаружил, что формула θ = atan (r) в документации OpenCV «рыбий глаз» является нормализованной обратной величиной r = f * tanθ, относящейся к проекции точечного отверстия, и, следовательно, ни одна из моделей проекции «рыбий глаз», упомянутых в вышеуказанные ссылки используются в OpenCV.
Кроме того, что касается модели искажения, то, как мне кажется, используется модель деления Фитцгиббона в его статье 2001 года «Одновременная линейная оценка геометрии нескольких видов и искажения линзы». Согласно Хьюзу в его статье 2008 года «Обзор компенсации геометрических искажений в камерах типа« рыбий глаз », среди других альтернатив -« Нечетная полиномиальная модель »и« Полиномиальное преобразование рыбий глаз ». В своей статье на странице 2 он написал:
«(1) (что относится к Нечетная полиномиальная модель) а также (3) (что относится к Модель деления, который, как я полагаю, используется OpenCV), можно использовать для описания искажений в стандартных объективах без объектива «рыбий глаз». Однако обычно считается, что эти полиномиальные модели недостаточны для описания уровня искажения, вносимого линзами типа «рыбий глаз». Шах и Аггарвал показали в [9] (Процедура калибровки внутренних параметров для камеры с большим искажением типа «рыбий глаз» с моделью искажения и оценкой точности), что даже при использовании седьмые заказать версию (1) моделировать радиальные искажения типа «рыбий глаз», значительное искажение остается, до такой степени, что им пришлось использовать модель с большей степенью свободы. Следовательно, полином, который использует как нечетные, так и четные коэффициенты (вместо одного или другого) можно использовать для моделирования радиального искажения, вносимого объективом «рыбий глаз»
В конце концов, я делаю вывод о том, что модель «рыбий глаз» в OpenCV имеет очень ограниченную применимость и может быть значительно усилена с точки зрения моделей искажения и проекционных моделей. Я хотел бы еще раз подчеркнуть, что мне все еще нужно знать, какие документы использовались разработчиками OpenCV для реализации пространства имен «рыбий глаз».
Я был бы очень признателен за любые комментарии по этому поводу.
в соответствии с калибровочным кодом Bouguet «project_points_fisheye.m»
%Definitions:
%Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X)
%The coordinate vector of P in the camera reference frame is: Xc = R*X + T
%where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om);
%call x, y and z the 3 coordinates of Xc: x = Xc(1); y = Xc(2); z = Xc(3);
%The pinehole projection coordinates of P is [a;b] where a=x/z and b=y/z.
%call r^2 = a^2 + b^2,
%call theta = atan(r),
%Fisheye distortion -> theta_d = theta * (1 + k(1)*theta^2 + k(2)*theta^4 + k(3)*theta^6 + k(4)*theta^8)
%
%The distorted point coordinates are: xd = [xx;yy] where:
%
%xx = (theta_d / r) * x
%yy = (theta_d / r) * y
%
%Finally, convertion into pixel coordinates: The final pixel coordinates vector xp=[xxp;yyp] where:
%
%xxp = f(1)*(xx + alpha*yy) + c(1)
%yyp = f(2)*yy + c(2)
это Модель Брауна-Конради, упоминается в Набор инструментов для калибровки камеры для Matlab Рекомендации. Обсуждается в этой статье: Д. К. Браун «Калибровка камеры ближнего действия».
Также кажется, что текущая модель OpenCV игнорирует тангенциальные искажения (P(r)
).
Видеть это комментарий.