如果标注了对象的3D框,如何标记点云?

问题描述 投票:0回答:1

我正在尝试注释我的点云数据。我找到了许多工具,但只能通过Supervisely访问3D点云工具的演示版。通过在对象周围绘制3D框完成注释后,输出注释文件将采用JSON文件的形式。其中包含盒子的类和全局位置,方向和尺寸。如何使用此文件为这些3D框内的点分配标签。我想要.pcd文件或.bin文件中的输出格式。JSON文件的输出如下:

[{"id":36698,"name":"vel_1558647824006782.pcd","annotations":[{"className":"Car","geometryType":"cuboid","classId":957,"geometry":{"position":{"x":9.539855967959713,"y":18.342023271012913,"z":0.43944128482454614},"rotation":{"x":0,"y":0,"z":0},"dimensions":{"x":5.691547052392309,"y":1.6625674002633986,"z":1.757779283656416}}},{"className":"ground","geometryType":"cuboid","classId":958,"geometry":{"position":{"x":28.890481890779242,"y":8.463823613489927,"z":-1.0314986175132965},"rotation":{"x":0,"y":0,"z":0},"dimensions":{"x":96.34273328620523,"y":18.714553504372063,"z":1.0544185995045456}}}]}]

我想过使用PCL的crop_box filter。但是还有其他解决方法。如果有人可以将我指向其他能最好地解决问题的点云注释工具,这也将有所帮助?

python c++ data-annotations point-cloud-library
1个回答
0
投票

我能够编写一个c ++脚本来读取json文件,并使用PCL的cropbox过滤器解决该问题。使用的方法如下:

std::ifstream ifs("somepath.json");
json j = json::parse(ifs);
  • 2)提取每个框的“位置”(长方体的质心),长方体的“方向”,长方体的“尺寸”和“ className”。下面的代码显示了一种将位置数据提取到std :: vector的方法。 (我正在遍历盒子的数量。)
std::vector<float> position {
    j[0]["annotations"][i]["geometry"]["position"]["x"].get<float>(),
    j[0]["annotations"][i]["geometry"]["position"]["y"].get<float>(),
    j[0]["annotations"][i]["geometry"]["position"]["z"].get<float>()};
  • 3)获取框的顶点的最大和最小(x,y,z)坐标点。这作为对作物箱过滤器的输入。 (注意:x,y,z点不必与单个顶点相关。Xmin将是所有8个顶点的最小值x,Ymin将是所有8个顶点的最小值,依此类推。)

  • 4)使用PCL中的作物箱过滤器。这使您可以获取给定框中所有点的索引。可以找到示例herehere

  • 5)根据框的类别,为点云的那些索引处的点分配不同的颜色。
  • 6)保存点云。
  • 这是从输入的json文件标记点云的每个点的通用方法,该文件包含3D立方体的位置,尺寸和方向信息。

© www.soinside.com 2019 - 2024. All rights reserved.