将3D点云投射到给定视点的2D图像

时间:2013-08-22 14:13:51

标签: c++ point-cloud-library

我想要做的是将pointcloud光线投射到2D图像。我所拥有的是一个3D PointCloud和一个与一般世界坐标系不同的Viewpoint。我想从这个观点进行光线投射,以生成点云的2D图像。所以,我只需要一个像getintersectedvoxel这样的方法,它可以对整个区域进行投射,而不仅仅是单个光线。

1 个答案:

答案 0 :(得分:0)

这是从3D到相机的投影。您可以使用针孔相机模型方程式获得它(如图here所示)。

您需要前3个定义相机的参数:焦距f和投影平面的中心:cxcy。有了这个你创建一个3x3矩阵(我将使用matlab语法):

A = [ f 0 cx;
      0 f cy;
      0 0  1 ];

您可以使用cx = 0.5 * image_widthcy = 0.5 * image_height和某些值f = 800之类的内容(尝试使用其中一些来检查图片效果如何)。

然后,一个3x4矩阵,从相机框架到点云框架的转换(你说你有它):

T = [ r11 r12 r13 tx;
      r21 r22 r23 ty;
      r31 r32 r33 tz ];

最后,你的点云在齐次坐标系中,即在一个4xN矩阵中,用于具有N个点的点云:

P = [ x1 x2 ... xN;
      y1 y2 ... yN;
      z1 z2 ... zN;
       1  1 ...  1 ];

现在你可以投射点数:

S = A * T * P;

S是一个3xN矩阵,其中每个第i个3D点的像素坐标为:

x = S(1, i) / S(3, i);
y = S(2, i) / S(3, i);