跨多个框架的ARCore Pointcloud

时间:2019-05-03 11:00:04

标签: java android arcore

问题

您好,我一直在尝试跨多个框架捕获点云。但是,在可视化数据时,这些点似乎以某种方式稍微偏移或突出。

这是从最后一帧开始的点云数据的样子(增加点的大小以提高可见性)

Last frame

但是,当我尝试跨多个帧捕获数据时,数据似乎越来越靠近相机/向上延伸?

这里是同一对象,但点云存储在多个帧中

Multiple frames

最后是最后一帧和多帧(按比例绘制的点)的并排比较

Side by side

我希望会有更多的噪点,但是我不确定为什么当没有物体要跟踪时,数据似乎会越来越靠近相机。

我尝试过的事情

我以为最初我可能需要通过最后一帧的姿势来变换点,但是在对pose.compose和pose.inverse()进行一些组合之后,情况似乎变得更糟了(点云看起来并不像原始形状)

我的代码

这就是我获取点云的方式

ArrayList<PointCloud> PointClouds = new ArrayList();
int limit = 100;
int count = 0;

private void onUpdateFrame(FrameTime frameTime) 
{
   Frame frame = sceneView.getArFrame();

   if(frame != null)
   {
     if(count < limit)
     {
       PointClouds.add(frame.acquirePointCloud());
     }
     else
     {
       SavePointClouds();
     }
   }
}

这就是我保存数据的方式(减去Android文件的内容)

private void SavePointClouds()
{
    ArrayList<Vector3> Points = GetPointCloudData();

    StringBuilder sb = new StringBuilder();

    for (Vector3 point :Points) 
    {
       sb.append(point.x);
       sb.append(",");
       sb.append(point.y);
       sb.append(",");
       sb.append(point.z);
       sb.append("\n");
    }

    //This string is then written to the file
}

private ArrayList<Vector3> GetPointCloudData()
{
    ArrayList<Vector3> Data = new ArrayList();

    for(PointCloud pointCloud : PointClouds)
    {
       FloatBuffer points = pointCloud.getPoints();
       while (points.hasRemaining()) 
       {
         float x = points.get();
         float y = points.get();
         float z = points.get();
         float confidence = points.get();
         Data.add(new Vector3(x,y,z));
       }
    }

    return Data;
}

然后在CloudCompare中打开保存的文件以可视化数据。

在此先感谢您的帮助。

0 个答案:

没有答案