Внешняя калибровка камеры
У меня есть камера "рыбий глаз", которую я уже откалибровал. Мне нужно рассчитать положение камеры по шахматной доске, просто используя одно изображение упомянутой шахматной доски, внутренние параметры и размер квадратов шахматной доски. К сожалению, многие калибровочные библиотеки сначала вычисляют внешние параметры из набора изображений, а затем внутренние параметры, что по сути является "обратной" процедурой, которую я хочу. Конечно, я могу просто поместить свое изображение шахматной доски в набор других изображений, которые я использовал для калибровки, и снова выполнить процедуру калибровки, но это очень утомительно, и, кроме того, я не могу использовать шахматную доску другого размера, чем те, которые использовались для внутренняя калибровка. Кто-нибудь может указать мне правильное направление?
РЕДАКТИРОВАТЬ: Прочитав ответ Франческо, я понял, что я не объяснил, что я имею в виду, откалибровав камеру. Моя проблема начинается с того факта, что у меня нет классической матрицы внутренних параметров (поэтому я на самом деле не могу использовать метод, описанный Франческо). Фактически я откалибровал камеру "рыбий глаз" с помощью процедуры Scaramuzza ( https://sites.google.com/site/scarabotix/ocamcalib-toolbox), который в основном находит полином, который отображает точки трехмерного мира в координаты пикселей (или, наоборот, полином, который проецирует пиксели на единичную сферу). Теперь, я думаю, этой информации достаточно, чтобы найти позу камеры относительно шахматной доски, но я не совсем уверен, как действовать дальше.
2 ответа
Процедура solvePnP вычисляет внешнюю позу для шахматной доски (CB) в координатах камеры. openCV добавил библиотеку fishEye в свой модуль трехмерной реконструкции, чтобы учесть значительные искажения в камерах с большим полем зрения. Конечно, если ваша внутренняя матрица или преобразование не являются классической внутренней матрицей, вы должны изменить PnP:
- Отменить любую обратную проекцию, которую ты сделал
Теперь у вас есть так называемая нормализованная камера, в которой устранен собственный эффект матрицы.
k * [u, v, 1] T = R | T * [x, y, z, 1] T
Чтобы решить эту проблему, сначала нужно написать выражение для k:
k=R20*x+R21*y+R22*z+Tz
затем используйте приведенное выше выражение в
k*u = R00*x+R01*y+R02*z+Tx
k*v = R10*x+R11*y+R12*z+Tx
вы можете переставить термины, чтобы получить Ax=0, при условии |x|=1, где неизвестно
x = [R 00, R 01, R 02, T x, R 10, R 11, R 12, T y, R 20, R2 1, R 22, T z ] T
и A, b составлены из известных угловых координат u, v, x, y, z - пикселей и CB;
Затем вы решаете для x = последний столбец V, где A = ULV T, и собираете матрицы вращения и перемещения из x. Тогда есть несколько "грязных" шагов, которые на самом деле очень типичны для этого вида обработки:
A. Убедитесь, что вы получили реальную матрицу вращения - выполните ортогональные прокрусты на вашем R2 = UV T, где R = ULV T
B. Рассчитать масштабный коэффициент scl = sum (R2 (i, j) / R (i, j)) / 9;
C. Обновите вектор трансляции T2=scl*T и проверьте Tz>0; если оно отрицательно, инвертируйте T и отрицайте R;
Теперь R2, T2 дают вам хорошую отправную точку для оптимизации нелинейного алгоритма, такого как Левенберг Марквардт. Это необходимо, потому что предыдущий линейный шаг оптимизирует только алгебраическую ошибку параметров, в то время как нелинейный оптимизирует правильные метрики, такие как квадрат ошибки на расстояниях в пикселях. Однако, если вы не хотите выполнять все эти шаги, вы можете воспользоваться библиотекой "рыбий глаз" openCV.
Я предполагаю, что под "калибровкой" вы подразумеваете, что у вас есть модель точечного отверстия для вашей камеры.
Тогда преобразование между плоскостью вашей шахматной доски и плоскостью изображения является гомографией, которую вы можете оценить по изображению углов, используя обычный алгоритм DLT. Затем вы можете выразить его как произведение в масштабе матрицы внутренних параметров A и [x y t], где столбцы x и y представляют собой единичные векторы x и y мировой системы координат (то есть шахматной доски), а t вектор от центра камеры до начала того же кадра. То есть:
H = масштаб * A * [x|y|t]
Следовательно
[x|y|t] = 1/ масштаб * инв (A) * H
Масштаб выбирается так, чтобы x и y имели единичную длину. Если у вас есть x и y, третья ось является просто их перекрестным произведением.