2017-02-16 69 views
1

儘管我不知道如何編寫C++,但我嘗試使用CGAL嘗試使用點集形狀檢測從LiDAR點雲中導出建築物形狀。使用這些例子,我可以從文件中讀取點和法線,然後CGAL檢測形狀。該程序設置爲僅檢測平面形狀。點集形狀檢測:將平面形狀保存到文件

我想將平面形狀保存到一個文件,以便我可以在其他軟件中使用它們。但我無法找到如何實現這一目標的例子。我使用的測試程序基於efficient_RANSAC_parameters.cpp代碼。它在遍歷所有檢測到的形狀時有一部分。是否有可能添加一些將平面形狀寫入文件的東西?我發現OFF格式是一種流行且簡單的方法(在CGAL中)將多邊形保存到文件中,因此可能是一種很好的候選文件格式。

+0

OFF用於表示網格,在這裏您要保存平面以在其他軟件中使用它們。該格式是由其他軟件能夠讀取的內容強加的。 – sloriot

+0

我注意到在其他軟件中對OFF有足夠的支持。但任何其他非二進制格式都可以,因爲我可以使用文本處理來派生其他格式。我只想擁有一個我可以使用的文件。任何將直線座標寫入文本文件的方法都適用於我。 –

回答

0

在在用戶手冊可以看到,一旦你有平面形狀物體 if(Plane* plane = dynamic_cast<Plane*>(it->get())){..}可以從平面形狀獲得對象a CGAL::Plane_3,從中可以得到一個點和一個正常的,或係數的example飛機。

+0

謝謝,但我的問題是,我不知道如何將飛機的屬性寫入文件。但我找到了幫助,請參閱下面的答案。 –

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插入查詢,這些查詢允許我將數據傳輸到關係數據庫以供進一步處理。