erly 0 Жалоба Опубликовано October 30, 2018 Всем привет. Подскажите, пожалуйста, возможно ли откалибровать камеру, если известны 3D координаты нескольких (50) точек из реального мира и соответствующие им 2D координаты на изображении от камеры? Требуется найти как внутренние, так и внешние параметры камеры. Калибровать пытаюсь методом calibrateCamera. Мануалы с туториалами описывают калибровку с помощью шахматной доски нескольких видов. Оно работает нормально, только мне такое не подходит. Надо как-то обойтись настоящими координатами известных реперных точек в пространстве. Камера стоит в фиксированном положении относительно объекта съемки, поэтому по идее после вызова функции ожидаю получить не только Camera Matrix и Distortions, но и корректные Translation и Rotation векторы. Пробовал такие варианты: 1. В параметрах функции указываю реальные 3D координаты единым блоком: vector<vector<Point3f>>. Размерность вектора получается [1][50]. Аналогично для проективных точек: vector<vector<Point2f>>. Вызов функции приводит к ошибке: .. opencv-3.4.2/modules/calib3d/src/calibration.cpp:1468: error: (-5:Bad argument) For non-planar calibration rigs the initial intrinsic matrix must be specified in function 'cvCalibrateCamera2Internal' Ругается, что калибровочный шаблон - не плоскость. А он действительно не плоскость, а набор точек в некотором объеме пространства. 2. То же самое, но с флагом CV_CALIB_USE_INTRINSIC_GUESS. Ошибки нет, все матрицы вычислились. Но проверка не проходит. Пересчет проверочных 3D точек в экранные координаты выполняется не верно, ошибка сильная и бессистемная. Что я делаю не так? Кто-нибудь сталкивался с подобной задачей? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
erly 0 Жалоба Опубликовано November 1, 2018 Нашел рабочий вариант. Если кому интересно: Калибровку делал в 2 этапа. 1. Разделил все 3D точки реального объекта на плоскости (Z координаты обнулил), подал их в calibrateCamera отдельными векторами. И 2D точки из плоскости кадра разделил на отдельные векторы тоже. В результате получилось первое приближение cameraMatrix (M) и Distortions (D). Матрицы вращения (R) и положения (T) игнорируются. 2. Второй вызов calibrateCamera. У нее в параметрах Все 3D точки одним общим вектором, 2D точки одним вектором, M и D из первого шага. Вызов функции без флагов. В результате получились уточненные M и D, а также вычисленные R и T. Проверка по отображению других 3D точек объекта в 2D картинную плоскость прошла успешно. Всем спасибо, кто думал над задачей. Ваши мысли, выпущенные в ноосферу, безусловно помогли поиску решения. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах