В чем разница между solvePnP и calibrateCamera в opencv?

calibrateCamera() предоставляет rvec, tvec, distCoeff, cameraMatrix, в то время как solvePnP() принимает cameraMatrix, distCoeff в качестве входных данных и предоставляет rvec, tvec в качестве выходных. В чем разница между этими двумя функциями?

3 ответа

cv::calibrateCamera(...)

Функция оценивает следующие параметры монокулярной камеры с нескольких видов калибровочной диаграммы. Геометрия этого шаблона обычно известна (то есть это может быть шахматная доска):

  • Линейные внутренние параметры: фокусные расстояния в пикселях (это в основном масштабные коэффициенты), главная точка, которая в идеале должна быть в центре изображения, и иногда коэффициент перекоса между осями x и y (но это часто ноль).
  • Нелинейные внутренние параметры: ранее упомянутые параметры формируют матрицу линейной камеры, но есть также некоторые нелинейные параметры при преобразовании из 3D-камеры в плоскость 2D-изображения, то есть искажение линзы.
  • Внешние параметры: матрица трансформации между трехмерным миром и системами координат трехмерной камеры.

Оценка вышеупомянутых параметров обычно основана на 2D-3D соответствиях. Алгоритм обнаруживает некоторые двумерные точки на изображении (т.е. шахматную доску), для которых указываются соответствующие точки трехмерного объекта (известная трехмерная геометрия). Он выполняет следующие шаги в простейшем случае (может варьироваться в зависимости от флагов cv::calibrateCamera(..., int flags, ...)):

  • Вычисляет линейные внутренние параметры и считает, что нелинейные параметры равны нулю.
  • Оценивает начальную позу камеры (внешние характеристики) в зависимости от приближенных внутренних характеристик. Это сделано с помощью cv::solvePnP(...),
  • Выполняет алгоритм оптимизации Левенберга-Марквардта, чтобы минимизировать ошибку перепроецирования между обнаруженными точками 2D-изображения и 2D-проекциями точек 3D-объекта. Это сделано с помощью cv::projectPoints(...),

cv::solvePnP(...)

На этом этапе я также неявно ответил на роль cv::solvePnP(...) так как это часть cv::calibrateCamera(...), Если у вас есть встроенные функции камеры, вы можете предположить, что они никогда не изменятся (за исключением изменения оптики или масштабирования). С другой стороны, внешние параметры могут быть изменены, то есть вы можете повернуть камеру или поместить ее в другое место. Вы должны увидеть, что сценарий изменения позы объекта на камеру в этом случае очень похож. И это то, что cv::solvePnP(...) используется для.

Функция оценивает позу объекта с учетом:

  • Набор точек трехмерного объекта в системе координат модели (также может быть трехмерным миром),
  • Их 2D проекции на плоскость изображения,
  • Линейные и нелинейные внутренние параметры.

Выход из cv::solvePnP(...) задается как вектор вращения (rvec) вместе с вектором перевода (tvec), которые переносят точки 3D-объекта из системы координат модели в систему координат 3D-камеры.

calibrateCamera ( doc) оценивает внутренние коэффициенты (то есть матрицу камеры и коэффициенты искажения) для данной камеры. Эта функция требует, чтобы вы предоставили в качестве входных данных N наборов 2D-3D соответствий, связанных с N изображениями, снятыми одной и той же камерой с разных точек обзора (обычно N=30, см. Этот учебник по этой теме). Функция возвращает матрицу камеры и коэффициенты искажения для рассматриваемой камеры. Хотя они обычно не используются, внешние параметры (то есть положение и ориентация) также оцениваются, поэтому функция возвращает одну пару rvec а также tvec для каждого из N входных изображений.

solvePnP ( doc) оценивает внешние параметры для данного изображения с камеры. Эта функция требует, чтобы вы предоставили набор 2D-3D соответствий, связанных с одним изображением, полученным с помощью камеры с известными внутренними параметрами. Функция возвращает одну пару rvec а также tvec, соответствующий входному изображению.

calibrateCamera() предоставляет rvec, tvec, distCoeff, cameraMatrix ---- distCoeffs связаны с искажением изображения, а cameraMatrix обеспечивает центр изображения (Cx и Cy) и фокусное расстояние (Fx и Fy) (центр проекции). Это так называемые внутренние параметры. Если вы не измените диафрагму / фокус камеры, они останутся прежними. [он также предоставляет rvec и tvec, я пока не знаю, что может быть возможным его использованием. Это положение камеры в реальном мире. rvec и tvec также известны как внешние параметры]

solvePnP () принимает cameraMatrix, distCoeff в качестве входных данных и предоставляет rvec, tvec --- Используя Cx, Cy, Fx, Fy, он может оценить текущее положение камеры, то есть внешние параметры. Другими словами, сначала используйте calibrateCamera(), чтобы получить CameraMatrix и distCoeff. Используйте их в solvePNP(), и он сообщит вам о повороте (rvec) и перемещении (tvec) камеры при перемещении камеры относительно объекта реального мира (с некоторым маркером, как вы можете предположить).

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