Каковы основные ссылки на модель камеры для рыбьего глаза в OpenCV3.0.0dev?
Я борюсь с моделью камеры Fish-Eye, используемой в OpenCV 3.0.0.dev. Я прочитал документацию по этой ссылке несколько раз, особенно часть "Подробное описание" и формулы, моделирующие искажения типа "рыбий глаз". К настоящему времени у меня есть две проблемы:
-
Основываясь на проекционных моделях, перечисленных здесь, и их концептуальных объяснениях в " Точности модели объектива типа" рыбий глаз "" Хьюза, я не могу понять, какая проекционная модель использовалась в реализации OpenCV.
-
Поскольку описание является настолько кратким, мне нужно знать основные справочные документы, используемые разработчиками OpenCV для реализации пространства имен "рыбий глаз", чтобы я мог быть в курсе и получить более подробную информацию. PS Я проверил документацию OpenCV 3.0.0-dev и не нашел ничего полезного.
Ответы
Ответ 1
Короткий ответ:
Модель камеры OpenCV 3.0.0 Fisheye не использует модель Brown и ни одну из моделей, на которые ссылается OP от Panotools, она использует универсальную модель камеры Юхо Каннала и Сами С. Брандт.
Подробный ответ:
Как указывает Cfr в своем ответе, этот комментарий Ильи Крылова (который реализовал модель "рыбий глаз" в OpenCV) говорит, что они портировали инструментарий калибровки камеры для Matlab Жана-Ива Буге:
![Snapshot of the comment]()
Сайт Жан-Ива Буге (ссылка), в свою очередь, упоминает статью "Общая модель камеры и метод калибровки для обычных, широкоугольных объективов и объективов типа" рыбий глаз ") и сообщает:
"Недокументированная" модель "рыбий глаз", содержащаяся в наборе инструментов калибровки, следует модели проекции эквидистантности, описанной уравнением (3) в этой очень хорошей статье. Модель искажения следует уравнению (6), за исключением того, что k1 = 1 (в противном случае неотличимо от f).
Что, на мой взгляд, является вводящим в заблуждение утверждением или простым заблуждением, поскольку уравнение (3) и уравнение (6) соответствуют различным моделям: уравнение (6) - это фактическая модель, представленная в этой статье, которую авторы называют общей моделью камеры (отсюда название статьи). Чтобы быть более точным, уравнение (6) предназначалось для использования в качестве модели камеры, а уравнение (8) и (9) - для искажения или отклонения от этой модели.
Но одиссея еще не закончилась. Реализация OpenCV (в соответствии с документацией) сначала вычисляет проекцию с точечным отверстием, чтобы найти угол поля зрения (угол между трехмерной точкой, центром проекции и оптической осью). Это означает, что вы не можете использовать их модель "рыбий глаз" для проецирования лучей на 90º (или вы бы делили на 0) или близко к 90º (проблемы со стабильностью чисел, например, переполнение может произойти, если z достаточно мало). Более того, я не уверен, будет ли он работать для лучей более чем на 90º. Все это заставляет меня задуматься о "полезности" их моделей "рыбий глаз" для объективов "рыбий глаз" или широкоугольных объективов.
Если вы скептически относитесь к этому, вы можете взглянуть на исходный код OpenCV, конкретно на sources\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 (см. Также обсуждение модуля калибровки)
Ответ 2
После нескольких часов чтения я обнаружил, что формула θ = atan (r) в документации по рыбному глазу OpenCV является нормализованной инверсией r = f * tanθ, относящейся к проекции проксимального отверстия, и, следовательно, ни одна из проекций рыбьего глаза модели, упомянутые в приведенных выше ссылках, используются в OpenCV.
Кроме того, что касается модели искажений, то я думаю, что используется модель разделения Фицгиббона в его статье 2001 года "Одновременная линейная оценка множественной геометрии зрения и искажения объектива". Согласно Хьюзу в его статье 2008 года "Обзор компенсации геометрических искажений в камерах для рыбьего глаза" среди других альтернатив "Нечетная полиномиальная модель" и "Полиномиальное преобразование рыбьего глаза". В своей статье, на стр. 2, он написал:
" (1) (который ссылается на Нечетная полиномиальная модель) и (3) (что относится к Модели раздела, который, как я полагаю, используется при использовании OpenCV), можно использовать для описания искажений в стандартных объективах, отличных от fisheye. Однако, как правило, считается, что эти полиномиальные модели недостаточны для описания уровня искажений, (Shin and Aggarwal) показано в [9] (Процедура калибровки собственных параметров для камеры с высоким искажением глазного яблока с моделью искажения и оценки точности), что даже при использовании версии 7th (1) для моделирования радиального искажения рыбьего глаза, значительное искажение остается, поскольку они должны были использовать модель с большей степенью свободы. Поэтому полином, который использует как нечетные, так и четные коэффициенты (вместо просто одного или другого), может использоваться для моделирования введенного радиального искажения линзой рыбий глаз"
В конце концов, я пришел к выводу, что модель рыбьего глаза в OpenCV имеет очень ограниченную применимость и может быть значительно усилена с точки зрения моделей искажений и моделей прогноза. Я хотел бы еще раз подчеркнуть, что мне все еще нужно знать, какие документы были использованы разработчиками OpenCV для реализации пространства имен fisheye.
Я был бы глубоко признателен за любые комментарии по этому поводу.
Ответ 3
в соответствии с кодом Bouiget calib_tool "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)
Ответ 4
Это модель Brown-Conrady, упомянутая в Camera Calibration Toolbox для Matlab. Обсуждается в этой статье: D. C. Браун "Калибровка камеры близкого диапазона" .
Также кажется, что текущая модель OpenCV игнорирует тангенциальное искажение (P(r)
).
Смотрите comment.