Мировые координаты кадра камеры относительно реперной точки

Я пытаюсь определить положение камеры в мировых координатах относительно реперного положения на основе реперного маркера, найденного в сцене.

Моя методология определения viewMatrix описана здесь: Определить положение камеры?

У меня есть вращение и перевод [R | t] от обученного маркера к изображению сцены. Учитывая обучение калибровке камеры и, следовательно, внутренние результаты камеры, я должен быть в состоянии определить положение камеры в мировых координатах на основе перспективы и ориентации маркера, найденного на изображении сцены.

Может ли кто-нибудь направить меня к обсуждению или примеру, подобному этому? Я хотел бы знать положение моей камеры на основе реперного маркера, и я уверен, что что-то подобное уже было сделано раньше, я просто не ищу правильные ключевые слова.

Цените ваше руководство.


person P3d0r    schedule 09.02.2015    source источник


Ответы (1)


Что вы имеете в виду под мировыми координатами? Если вы имеете в виду координаты объекта, вам следует использовать обратное преобразование результата solvepnp. Учитывая матрицу вида [R|t], у нас есть inv([R|t]) = [R'|-R'*t], где R' — транспонирование R. В OpenCV:

cv::Mat rvec, tvec;
cv::solvePnP(objectPoints, imagePoints, intrinsics, distortion, rvec, tvec);

cv::Mat R;
cv::Rodrigues(rvec, rotation);

R = R.t();          // inverse rotation
tvec = -R * tvec;   // translation of inverse

// camPose is a 4x4 matrix with the pose of the camera in the object frame
cv::Mat camPose = cv::Mat::eye(4, 4, R.type());
R.copyTo(camPose.rowRange(0, 3).colRange(0, 3)); // copies R into camPose
tvec.copyTo(camPose.rowRange(0, 3).colRange(3, 4)); // copies tvec into camPose

Обновление №1:

Результат solvePnP

solvePnP оценивает позу объекта по набору точек объекта (координат модели), соответствующих им проекций изображения (координат изображения), а также матрицы камеры и коэффициентов искажения.

Поза объекта задается двумя векторами, rvec и tvec. rvec представляет собой компактное представление матрицы поворота для вида шаблона, видимого на изображении. То есть rvec вместе с соответствующим tvec переносит реперный шаблон из координатного пространства модели (в котором указаны точки объекта) в координатное пространство камеры.

То есть мы находимся в координатном пространстве камеры, оно движется вместе с камерой, а камера всегда в начале координат. Оси камеры имеют те же направления, что и оси изображения, поэтому

  • ось x указывает в правую сторону от камеры,
  • ось Y направлена ​​вниз,
  • и ось z указывает на направление взгляда камеры

То же самое относится и к координатному пространству модели, поэтому, если вы указали начало координат в правом верхнем углу реперного шаблона, то

  • ось x указывает вправо (например, вдоль более длинной стороны вашего шаблона),
  • ось y указывает на другую сторону (например, вдоль более короткой стороны),
  • и ось z указывает на землю.

Вы можете указать начало мира, поскольку первая точка точек объекта, которая является первым объектом, установлена ​​​​на (0, 0, 0), а все остальные точки имеют z=0 (в случае плоских шаблонов). Затем tvec (объединенный rvec) указывает на начало координат мирового пространства, в котором вы разместили реперный образец. Выходные данные solvePnP имеют те же единицы измерения, что и точки объекта.

Взгляните на следующее: 6dof позиционное отслеживание< /а>. Я думаю, что это очень похоже на то, что вам нужно.

person Kornel    schedule 09.02.2015