Получение комплексных чисел при расчете внутренних параметров камеры

1

Я пытаюсь реализовать алгоритм Чжана для калибровки камеры в MATlab. Шаги для этого должны быть довольно простыми и простыми в реализации, особенно с использованием MATLab. Тем не менее, я застрял в точке, где я получаю сложные номера, где мне нужно получать реальные цифры.

Если кто-то из вас сделал это раньше, вы точно знаете, что должно быть сделано. Первым шагом было бы сделать изображения шахматной доски и рассчитать отображение гомографии между плоскостью модели и плоскостью изображения, используя приведенное ниже уравнение (я в основном будет включать большую часть моего кода, потому что он очень маленький):

for i=1:n
    p=[X(i,:) z -x(i,1).*X(i,1) -x(i,1).*X(i,2) -x(i,1)];
    q=[z X(i,:) -x(i,2).*X(i,1) -x(i,2).*X(i,2) -x(i,2)];
    E=[E;p;q];
end

где X содержит однородные координаты углов шахматной доски в мировой плоскости, а x содержит однородные координаты в плоскости изображения.

Следующим шагом будет решение уравнения EH = 0 для получения H:

  [u d v]=svd(E);
  H= v(:,end);
  H= reshape(H,3,3)';

Я не буду подробно описывать, что каждая переменная находится в остальном коде, потому что я предполагаю, что получаю помощь от людей, которые уже сделали это (это довольно популярный алгоритм), поэтому я буду просто поместите код как есть с некоторыми комментариями:

vij = @(i,j,H) [ H(i,1)*H(j,1)
                     H(i,1)*H(j,2) + H(i,2)*H(j,1)
                     H(i,2)*H(j,2)
                     H(i,3)*H(j,1) + H(i,1)*H(j,3)
                     H(i,3)*H(j,2) + H(i,2)*H(j,3)
                     H(i,3)*H(j,3) ];
G = [ vij(1,2,H)'; (vij(1,1,H)-vij(2,2,H))' ];
V = [ V; G ];

конечно, в приведенном выше фрагменте кода мы находимся внутри цикла, который выполняется столько раз, сколько есть изображений

Далее следующая самая прямая часть всего алгоритма, где вы просто не ошибетесь, где вычисляем внутренние параметры:

[u1,d1,v1] = svd( V );
b = v1(:,end);
v0 = ( b(2)*b(4)-b(1)*b(5) ) / ( b(1)*b(3)-b(2)^2 );
lambda = b(6) - ( b(4)^2 + v0*(b(2)*b(4)-b(1)*b(5)) ) / b(1);
b(1)
alpha = sqrt( lambda / b(1) );
beta = sqrt( lambda*b(1) / (b(1)*b(3)-b(2)^2) );
gamma = -b(2)*alpha^2*beta / lambda;
u0 = gamma*v0 / beta - b(4)*alpha^2 / lambda;
A = [ alpha  gamma  u0;
      0      beta   v0;
      0      0      1   ]

Затем нам нужно учитывать разницу в квадратных размерах между плоскостью изображения и мировой плоскостью, поэтому мы строим матрицу нормализации:

N = [ 2/width     0      -1
                0     2/height  -1
                0        0       1 ];

Где высота и ширина изображения в пикселях.

Наконец, внутренняя матрица A может быть получена по следующей строке:

A = N\A;

Теперь, чтобы убедиться, что я получаю точные результаты, я сравнил результаты с калибровочным инструментом от caltech (Bouget), и по какой-то причине я получаю u0 и v0 правильно, но остальные (альфа, бета, гамма) на самом деле это сложные числа.

И я понимаю, что это потому, что лямбда может быть отрицательной. Кроме того, этого не должно быть! и что проблема!

Я просмотрел буквально сотни реализаций в Интернете, и все они очень близки к моим, но все они получили ВСЕ их внутренности. Мне кажется, что мои u0 и v0 ТОЧНО правы, а остальные просто сложны.

Не могли бы вы помочь? Я был бы очень признателен!!

  • 0
    Вы смогли понять это? Я столкнулся с той же проблемой.
Теги:
camera
camera-calibration
calibration

1 ответ

0

Может быть, это немного тривиально, но попробовали ли вы использовать другие имена переменных, чем i и j?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню