Есть ли какая-нибудь функция opencv для вычисления перепроектированных точек?
Какова процедура для вычисления перепроецированных точек, репроецированных ошибок и средней ошибки репроекции из заданных мировых точек (исходных координат), внутренней матрицы, матриц вращения и вектора переноса?
Есть ли для этого встроенная функция opencv или мы должны рассчитать мануал?
Если нам нужно рассчитать вручную, каков наилучший способ получить перепроектированные баллы?
2 ответа
projectPoints
проецирует 3D точки на плоскость изображения.
calibrateCamera
возвращает окончательную ошибку повторного проецирования. calibrateCamera
находит внутренние и внешние параметры камеры из нескольких видов калибровочного шаблона.
Функция оценивает внутренние параметры камеры и внешние параметры для каждого из видов. Алгоритм основан на [Zhang2000] 1 и [BouguetMCT] 2. Координаты точек 3D-объекта и их соответствующие 2D-проекции в каждом виде должны быть указаны. Это может быть достигнуто путем использования объекта с известной геометрией и легко обнаруживаемыми характерными точками. Такой объект называется калибровочной установкой или калибровочным шаблоном, и OpenCV имеет встроенную поддержку шахматной доски в качестве калибровочной установки (см.
findChessboardCorners()
).Алгоритм выполняет следующие шаги:
Вычислите начальные внутренние параметры (опция доступна только для плоских калибровочных шаблонов) или считайте их из входных параметров. Все коэффициенты искажения изначально установлены на нули, если только некоторые из
CV_CALIB_FIX_K?
указаны.Оцените начальную позу камеры, как будто внутренние параметры уже известны. Это сделано с помощью
solvePnP()
,Запустите глобальный алгоритм оптимизации Левенберга-Марквардта, чтобы минимизировать ошибку перепроецирования, то есть общую сумму квадратов расстояний между наблюдаемыми характерными точками
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
Я не могу объяснить здесь математику, чтобы сделать ответ кратким.
Вот краткое описание процедуры:
- Получите несколько представлений одного и того же ссылочного объекта, например шахматной доски.
- Введите objectPoints, imagePoints и другие параметры, и вы получите коэффициент искажения, внутреннюю матрицу камеры 3x3, векторы вращения и вектор перемещения.
- После калибровки встроенной матрицы камеры вы сможете рассчитать перепроецированные точки с помощью функции cv.projectPoints, которая проецирует 3D-точки на плоскость 2D-изображения.
Для этого вам понадобится opencv, но для простоты вы можете использовать версию opencv для Python, чтобы сделать то же самое за счет производительности.
https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b
Удачи!