点集形状检测:将平面形状保存到文件

时间:2017-02-16 12:33:28

标签: cgal

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

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

2 个答案:

答案 0 :(得分:1)

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

render() {
    return (
     <div>
        <ul>
           <li><Link to="/">Home</Link></li>
           <li><Link to="/one">One</Link></li>
           <li><Link to="/two">Two</Link></li>
           <li><Link to="/three">Three</Link></li>
        </ul>
        {this.props.children}
      </div>
    );
  }

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

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++;
}

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

答案 1 :(得分:0)

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