0

PCL로 구현 된 Marching Cubes 알고리즘을 사용하여 포인트 클라우드에서 메쉬를 생성하려고합니다. 내 포인트 클라우드에 https://github.com/atduskgreg/pcl-marching-squares-example/blob/master/marching_cubes.cpp에 주어진 코드를 적용하려고합니다 (내 코드는 아래에 나와 있습니다). Visual Studio 2015가 성공적으로 빌드되지만 실행하면 디버그 어설 션 오류에 대한 오류 메시지가 표시됩니다. 표현식은 "범위 밖의 벡터 첨자"입니다. 이 오류 메시지에 대해 저를 도울 수 있습니까? 내 또 다른 질문은 성공적으로 폴리곤 메쉬를 생성 할 수 있다면, 어떻게 .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 및 cloud_normals의 크기를 확인하고 concatenateFields()에 예상 한 출력이 있는지 확인합니다. Visual Studio를 사용하고 있으므로 디버깅 도구를 사용하여 예기치 않은 동작이 언제 시작되는지 확인할 수 있습니다.

0

감사합니다. 코드를 가지고 놀았을 때 나는 행진하는 큐브의 멤버를 정의하지 않았다는 것을 깨달았습니다. 이 멤버를 정의 할 때 오류 메시지가 표시되지 않습니다. 그러나 생성 된 메쉬는 완전히 다릅니다. 이유를 알아 내려고 노력 중입니다. 감사합니다.