У меня есть облако точек изображения глубины, которое было снято камерой на 30 градусов выше горизонтали (повернуто на 30 градусов по оси z). Я хочу перевести все точки обратно в их положение, как если бы камера находилась под углом 0 градусов, что, я думаю, я могу сделать со следующей матрицей вращения:
|cos(30) -sin(30) 0|
|sin(30) cos30 0|
|0 0 1|
Однако, глядя на метод pcl для преобразования облака точек, я обнаружил следующее:
pcl::transformPointCloud (const PointCloud< PointT > &cloud_in,
PointCloud< PointT > &cloud_out, const Eigen::Matrix< Scalar, 4, 4 > &transform)
Но почему это матрица 4х4, а не вращение 3х3 выше?
|x||1 0 0 a| = |x+a|
|y||0 1 0 b| |y+b|
|z||0 0 1 c| |z+c|
|1||0 0 0 1| |1 |
В этом примере мы переместили точку (x, y, z) в точку (x + a, y + b, z + c). Это можно сделать только с помощью матрицы 4х4.
|cos(30) -sin(30) 0 0| multiply The Matrix above.
|sin(30) cos30 0 0|
|0 0 1 0|
|0 0 0 1|
Это даст вам вращение и перевод точки.
Матрица 4×4 — это матрица преобразования в следующем виде
| R | t |
|--------- |
|0 0 0 | 1 |
где R
ваша матрица вращения 3х3 и t
является вектором перевода 3×1. В твоем случае t = [0,0,0]'
Для получения дополнительной информации: http://en.wikipedia.org/wiki/Transformation_matrix