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

Posted

技术标签:

【中文标题】如果我对对象的 3D 框进行了注释,如何标记点云?【英文标题】:How do I label the pointcloud if I have the 3D boxes of the objects annotated? 【发布时间】:2019-09-24 21:13:52 【问题描述】:

我正在尝试注释我的点云数据。我找到了很多工具,但只能通过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。但是有没有其他方法可以解决它。如果有人可以向我指出可以最好地帮助我解决问题的其他点云注释工具,那也会有所帮助?

【问题讨论】:

问题太多。你能澄清一下吗?千万不要掉入XY problem的陷阱 【参考方案1】:

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

1) 使用nlohmann/json读取json文件
std::ifstream ifs("somepath.json");
json j = json::parse(ifs);
2) 提取“位置”(长方体的质心)、长方体的“方向”、长方体的“维度”和每个框的“类名”。下面的代码显示了一种将位置数据提取到 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)坐标点。这作为cropbox过滤器的输入。 (注意:x,y,z 点不必与单个顶点相关。Xmin 将是所有 8 个顶点中的最小 x,Ymin 将是所有 8 个顶点中的最小值,依此类推。)

4) 使用来自 PCL 的裁剪框过滤器。这使您可以获取给定框中所有点的索引。可以在here 和here 找到示例。

5) 根据框的类别,为点云索引处的点分配不同的颜色。 6) 保存点云。

这将是一种从输入 json 文件中标记点云的每个点的通用方法,该文件包含 3D 立方体的位置、尺寸和方向信息。

【讨论】:

感谢您澄清@Anirudh。理想输出和您的输出之间存在细微差别。您的过程标记了多余的点(在原始框之外),因为cropbox 需要所有 8 个的最小值和最大值(正如您在 pt 3 中适当指出的那样)。我只是为未来的观众提及。 @KunalTyagi 感谢您指出这一点。我在注释中看到,框外的一些点也被错误注释了。你能解释一下我哪里出错了,我该如何解决?裁剪框过滤器不应该返回仅在框内的索引吗? cropbox 过滤器与云轴对齐,而不是与注释工具给出的 3d 标签框的轴对齐。不过,这可能是 PCL 中的一个很好的功能 我明白,但是我得到的 3D 框的方向是相对于点云的,这就是我传递给裁剪框过滤器的方向。如果可能,您能否提供有关该问题的更多详细信息?我将不胜感激!!! 您能为此创建一个新问题吗?评论不利于此类讨论

以上是关于如果我对对象的 3D 框进行了注释,如何标记点云?的主要内容,如果未能解决你的问题,请参考以下文章

点云处理技术之open3d第三篇:点云的高级操作篇——点云边界框凸包DBSCAN聚类平面分割和隐点移除

论文解读 | F-PointNet, 使用RGB图像和Depth点云深度, 数据的3D目标检测

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测

如何使用 python 从 2d 坐标中获取 3d 空间坐标?

点云处理技术之open3d第二篇:点云的基本操作篇——可视化降采样法向量裁剪和绘制点云