0

我正嘗試使用在PCL中實施的Marching Cubes算法從點雲生成網格。我正在修改https://github.com/atduskgreg/pcl-marching-squares-example/blob/master/marching_cubes.cpp給我的點雲代碼(我的代碼在下面給出)。 Visual Studio 2015成功構建,但是當我運行它時,我收到關於調試斷言失敗的錯誤消息。表達式是「Vector下標超出範圍」。你能幫我解決這個錯誤信息嗎?我的另一個問題是,如果我可以成功生成多邊形網格,如何以.obj,.ply或.wrl格式導出它? 我期待着您的 問候Marching Cubes Reconstruction - 向量下標超出範圍

#include <iostream> 
#include <pcl/point_cloud.h> 
#include <pcl/octree/octree.h> 
#include<conio.h> 
#include <iostream> 
#include <vector> 
#include <ctime> 
#include <pcl/io/pcd_io.h> 
#include <pcl/console/print.h> 
#include <pcl/console/parse.h> 
#include <pcl/console/time.h> 
#include <pcl/surface/3rdparty/poisson4/geometry.h> 
#include <pcl/registration/distances.h> 
#include <pcl/common/distances.h> 
#include <pcl/io/ply_io.h> 
#include <pcl/point_types.h> 
#include <pcl/search/kdtree.h> 
#include <pcl/features/normal_3d_omp.h> 
#include <pcl/surface/marching_cubes_rbf.h> 
#include <pcl/surface/marching_cubes_hoppe.h> 
#include <pcl/surface/marching_cubes.h> 

int 
main(int argc, char** argv) 
{ 
     srand((unsigned int)time(NULL)); 
     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 
     //pcd'ye dönüştürülen dosyanın okunması 
     pcl::io::loadPCDFile<pcl::PointXYZ>("silindir_arka_ENTIRE_DATA_ELIMINATED_REG_PCD.pcd", *cloud); 
     pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; 
     ne.setInputCloud(cloud); 
     pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>()); 
     tree1->setInputCloud(cloud); 
     ne.setInputCloud(cloud); 
     ne.setSearchMethod(tree1); 
     ne.setKSearch(20); 
     pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>); 
     ne.compute(*cloud_normals); 

     pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>); 
     pcl::concatenateFields(*cloud, *cloud_normals, *cloud_with_normals); 
     cloud_with_normals->points[0].normal_x; 

     std::cout << cloud_with_normals->points[0].normal_x << " " << cloud_with_normals->points[0].normal_y << " " << cloud_with_normals->points[0].normal_z << std::endl; 
     pcl::search::KdTree<pcl::PointNormal>::Ptr tree(new pcl::search::KdTree<pcl::PointNormal>()); 
     tree->setInputCloud(cloud_with_normals); 
     std::cout << "begin marching cubes reconstruction" << std::endl; 

     pcl::MarchingCubesHoppe<pcl::PointNormal> mc; 
     pcl::PolygonMesh::Ptr triangles(new pcl::PolygonMesh); 

     std::cout << "111" << std::endl; 
     mc.setInputCloud(cloud_with_normals); 
     std::cout << "222" << std::endl; 
     mc.setSearchMethod(tree); 
     std::cout << "333" << std::endl; 
     mc.reconstruct(*triangles); 

     std::cout << triangles->polygons.size() << " triangles created" << std::endl; 

     return(0); 

} 
+0

我可能會知道哪個函數調用導致斷言失敗。 –

回答

0

它看起來像矢量下標越界聽到來自索引到cloud_with_normals在[0]。我會檢查雲和cloud_normals的大小,看看concatenateFields()是否具有您期望的輸出。由於您使用的是Visual Studio,因此您可以使用調試工具查看意外行爲何時開始。

0

我很感謝您的幫助。當我在玩代碼時,我意識到我沒有定義行進立方體的一些成員。當我定義這些成員時,我不會收到任何錯誤消息。但是,我生成的網格完全不同。我試圖找出原因。 Regards