Есть ли какая-нибудь функция opencv для вычисления перепроектированных точек?

Какова процедура для вычисления перепроецированных точек, репроецированных ошибок и средней ошибки репроекции из заданных мировых точек (исходных координат), внутренней матрицы, матриц вращения и вектора переноса?

Есть ли для этого встроенная функция opencv или мы должны рассчитать мануал?

Если нам нужно рассчитать вручную, каков наилучший способ получить перепроектированные баллы?

2 ответа

Решение

projectPoints проецирует 3D точки на плоскость изображения.

calibrateCamera возвращает окончательную ошибку повторного проецирования. calibrateCamera находит внутренние и внешние параметры камеры из нескольких видов калибровочного шаблона.

Функция оценивает внутренние параметры камеры и внешние параметры для каждого из видов. Алгоритм основан на [Zhang2000] 1 и [BouguetMCT] 2. Координаты точек 3D-объекта и их соответствующие 2D-проекции в каждом виде должны быть указаны. Это может быть достигнуто путем использования объекта с известной геометрией и легко обнаруживаемыми характерными точками. Такой объект называется калибровочной установкой или калибровочным шаблоном, и OpenCV имеет встроенную поддержку шахматной доски в качестве калибровочной установки (см. findChessboardCorners()).

Алгоритм выполняет следующие шаги:

  1. Вычислите начальные внутренние параметры (опция доступна только для плоских калибровочных шаблонов) или считайте их из входных параметров. Все коэффициенты искажения изначально установлены на нули, если только некоторые из CV_CALIB_FIX_K? указаны.

  2. Оцените начальную позу камеры, как будто внутренние параметры уже известны. Это сделано с помощью solvePnP(),

  3. Запустите глобальный алгоритм оптимизации Левенберга-Марквардта, чтобы минимизировать ошибку перепроецирования, то есть общую сумму квадратов расстояний между наблюдаемыми характерными точками imagePoints и проецируемые (с использованием текущих оценок параметров камеры и поз) точки объекта objectPoints, Увидеть projectPoints() для деталей. Функция возвращает окончательную ошибку повторного проецирования.

1 ZHANG, Zhengyou. Гибкая новая техника для калибровки камеры. Анализ образов и машинный интеллект, IEEE транзакции, 2000, 22.11: 1330-1334.

2 JYBouguet. Инструмент калибровки MATLAB. http://www.vision.caltech.edu/bouguetj/calib_doc/

калибровка камеры() из openCV на основе калибровочной бумаги Чжана — это то, что вам нужно https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf

Я не могу объяснить здесь математику, чтобы сделать ответ кратким.

Вот краткое описание процедуры:

  1. Получите несколько представлений одного и того же ссылочного объекта, например шахматной доски.
  2. Введите objectPoints, imagePoints и другие параметры, и вы получите коэффициент искажения, внутреннюю матрицу камеры 3x3, векторы вращения и вектор перемещения.
  3. После калибровки встроенной матрицы камеры вы сможете рассчитать перепроецированные точки с помощью функции cv.projectPoints, которая проецирует 3D-точки на плоскость 2D-изображения.

Для этого вам понадобится opencv, но для простоты вы можете использовать версию opencv для Python, чтобы сделать то же самое за счет производительности.

https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b

Удачи!

Другие вопросы по тегам