【问题标题】:Point Set Shape Detection: save planar shapes to file点集形状检测:将平面形状保存到文件
【发布时间】:2017-03-09 20:45:42
【问题描述】:

虽然我不知道如何编写 C++,但我正在尝试使用 CGAL 来尝试使用点集形状检测从 LiDAR 点云导出建筑形状。使用这些示例,我可以从文件中读取点和法线,然后 CGAL 检测形状。该程序设置为仅检测平面形状。

我想将平面形状保存到一个文件中,以便在其他软件中使用它们。但我找不到如何实现这一目标的例子。我使用的测试程序基于efficient_RANSAC_parameters.cpp 代码。当它遍历所有检测到的形状时,它有一部分。是否可以在那里添加一些将平面形状写入文件的东西?我看到 OFF 格式是一种流行且简单的方法(在 CGAL 中)将多边形保存到文件中,因此这可能是一种很好的候选文件格式。

【问题讨论】:

  • OFF 用于表示网格,这里您要保存平面以便在其他软件中使用它们。格式是由其他软件能够读取的内容强加的。
  • 我注意到其他软件对OFF有足够的支持。但是任何其他非二进制格式都可以,因为我可以使用文本处理来导出其他格式。我只想有一个我可以使用的文件。任何将形状坐标逐行写入文本文件的方式都对我有用。

标签: cgal


【解决方案1】:

一位确实知道如何编写 C++ 的同事帮助我解决了这个问题。他想出了以下几点:

while (it != shapes.end()) {
  if (Plane* plane = dynamic_cast<Plane*>(it->get()))
  {
    std::cout << "PLANE_" << count++ << "[" << std::endl;
    const std::vector<size_t> indices = it->get()->indices_of_assigned_points();
    std::vector<size_t>::const_iterator iti = indices.begin();
    while (iti != indices.end()) {
      // Retrieves point
      Point_with_normal pw = *(points.begin() + (*iti));
      Kernel::Point_3 p = pw.first;
      std::cout << "POINT[" << p.x() << "," << p.y() << "," << p.z() << "]" << std::endl;
      // Proceeds with next point.
      iti++;
    }
    std::cout << "]" << std::endl;
  }
  // Proceeds with next detected shape.
  it++;
}

此块可以替换efficient_RANSAC_parameters.cpp 示例中的循环。输出如下所示:

PLANE_0[
POINT[34.96,584.49,0.47]
POINT[34.97,585.24,0.54]
POINT[34.88,584.51,0.49]
POINT[34.98,584.75,0.49]
]

这给了我一些可以使用的东西。在我的例子中,我使用 sed 将此输出转换为 SQL 插入查询,允许我将数据传输到关系数据库以进行进一步处理。

【讨论】:

    【解决方案2】:

    在用户手册的example 中,您可以看到,一旦您有了平面形状的对象 if(Plane* plane = dynamic_cast&lt;Plane*&gt;(it-&gt;get())){..}可以从平面形状对象中得到CGAL::Plane_3,从中可以得到点和法线,或者平面的系数。

    【讨论】:

    • 谢谢,但我的问题是我不知道如何将飞机的属性写入文件。但我找到了帮助,请参阅下面的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2019-10-23
    • 2016-06-01
    • 2020-09-26
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多