Каковы основные ссылки на модель камеры для рыбьего глаза в OpenCV3.0.0dev?

Я борюсь с моделью камеры Fish-Eye, используемой в OpenCV 3.0.0.dev. Я прочитал документацию по этой ссылке несколько раз, особенно часть "Подробное описание" и формулы, моделирующие искажения типа "рыбий глаз". К настоящему времени у меня есть две проблемы:

  1. Основываясь на проекционных моделях, перечисленных здесь, и их концептуальных объяснениях в " Точности модели объектива типа" рыбий глаз "" Хьюза, я не могу понять, какая проекционная модель использовалась в реализации OpenCV.

  2. Поскольку описание является настолько кратким, мне нужно знать основные справочные документы, используемые разработчиками 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)