1

У меня есть камера с рыбий глаз, которую я уже откалибровал. Мне нужно рассчитать позыв камеры w.r.t на шахматной доске, просто используя одно изображение указанной шахматной доски, внутренние параметры и размер квадратов шахматных досок. К сожалению, многие библиотеки калибровки сначала вычисляют внешние параметры из набора изображений, а затем внутренние параметры, которые по сути являются «обратной» процедурой того, что я хочу. Конечно, я могу просто поместить свое изображение шахматной доски в множество других изображений, которые я использовал для калибровки, и снова запустить процедуру калибровки, но это очень утомительно, и более того, я не могу использовать шахматную доску разного размера от тех, которые использовались для инкрементная калибровка. Может ли кто-нибудь указать мне в правильном направлении?внешняя калибровка камеры

EDIT: После прочтения ответа Франческо я понял, что не объяснил, что я имею в виду, калибруя камеру. Моя проблема начинается с того факта, что у меня нет классической матрицы внутренних параметров (поэтому я не могу фактически использовать метод, описанный Франческо). Фактически я откалибровал камеру с рыбий глаз с помощью процедуры Скарамуззы (https://sites.google.com/site/scarabotix/ocamcalib-toolbox), которая в основном находит полином, который отображает 3D-точки мира в пиксельные координаты (или, альтернативно, полином, который возвращает проекции пикселей в единицу сферы). Теперь, я думаю, этих данных достаточно, чтобы найти позу камеры w.r.t. шахматная доска, но я не уверен, как это сделать.

+0

Предположим, что у вас есть два луча, проходящих через ограничивающие точки стороны квадрата «r1 = (x1, y1,1)» и «r2 = (x2, y2,1)» в нормализованных координатах. Зная, что в мировых координатах лучи связаны сегментом длины 'w' (ширина квадрата), образующим треугольник, и что координаты точки в мировых координатах будут кратными нормализованным, вы можете восстановить поза, используя эти ограничения для нескольких точек в системе, может быть? Просто идея – aledalgrande

+0

да, это одна из идей, которые у меня есть: в основном я должен найти конкретную плоскость, на которой, проецируя все углы шахматной доски из изображения, я получаю исходную шахматную доску с правильным квадратным размером и перпендикулярными сторонами. Так что, как будто у меня есть параметрическая плоскость, и мне нужно найти ее параметры и, следовательно, позу. Но я не уверен, как математически формализовать проблему. – Alb

ответ

0

процедура solvePnP вычисляет внешнюю позу для шахматной доски (CB) в координатах камеры. openCV добавила библиотеку fishEye в свой модуль 3D-реконструкции для значительных искажений в камерах с большим полем обзора. Конечно, если ваша собственная матрица или преобразование не является классической внутренней матрицы вы должны изменить PnP:

  1. Undo любой обратной проекции вы сделали
  2. Теперь вы так называемая нормированной камеру, где внутренняя матрица эффект устранены.

    к * [U, V, 1] Т = Р | Т * [х, у, г, 1] Т

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

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, при условии | х | = 1, где неизвестный

х = [R , R , R , T х, R , R 11 , R 12 , Т у, R , R2 , R , Т г] T

и A, b составлены из известных координатных координат u, v, x, y, z - пикселей и CB;

Затем вы решаете для x = последний столбец V, где A = ULV T, и соберите матрицы вращения и преобразования от x. Есть еще несколько «грязных» шагов, которые на самом деле очень характерно для этого вида обработки:

A. Убедитесь, что вы получили матрицу реального поворота - выполнять ортогональное Procrustes на вашем 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 дают вам хорошую отправную точку для оптимизации нелинейных алгоритмов, таких как Levenberg Marquardt. Это необходимо, потому что предыдущий линейный шаг оптимизирует только алгебраическую ошибку параметров, в то время как нелинейная оптимизирует правильные показатели, такие как квадратная ошибка в пиксельных расстояниях. Однако, если вы не хотите следовать всем этим шагам, вы можете воспользоваться fish-eye library openCV.

+0

Где бы вы взяли 3D-очки, необходимые PnP? – aledalgrande

+0

Я думаю, что 3D-точки - это только углы «реальной» шахматной доски, при этом компоненты Z равны нулю. Я действительно пытался сделать то, что вы описали Влад, на самом деле я прочитал документ, на котором основан калибровочный инструмент, и придумал систему однородных уравнений (поэтому нет вектора «b», поскольку все постоянные члены равны нулю) , К сожалению, попытка решить его с помощью Matlab приводит к тривиальному решению (нулевой вектор). Не уверен, что здесь не так. – Alb

+0

aledalgrande, вы знаете квадратный размер шахматной доски (например, sz), вы просто наложили на него локальную систему координат и сделаете углы как x = i * sz, y = j * sz, z = 0; Обратите внимание, что это локальная система координат, связанная с CB, а не с центром камеры. – Vlad

0

Я предполагаю, что при калибровке вы имеете в виду, что у вас есть модель обскуры для вашей камеры.

Тогда трансформация между вашей плоскостью шахматной доски и плоскостью изображения является гомографией, которую вы можете оценить по изображению углов, используя обычный алгоритм DLT. Затем вы можете выразить его как произведение, вплоть до масштаба, матрицы внутренних параметров A и [xyt], где x и y столбцы являются x и y единичными векторами системы координат мира (т.е. шахматной доски), а t является вектор от центра камеры до начала того же кадра. То есть:

Н = шкала * А * [х | у | т]

Поэтому

[х | у | т] = 1/шкала * INV (А) * Н

Шкала выбирается так, чтобы x и y имели единичную длину. Как только у вас есть x и y, третья ось - только их кросс-продукт.

Смежные вопросы