Что вы имеете в виду под мировыми координатами? Если вы имеете в виду координаты объекта, вам следует использовать обратное преобразование результата 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