Реконструкция марширующих кубов - индекс вектора вне допустимого диапазона

Я пытаюсь создать сетку из облака точек, используя алгоритм Marching Cubes, реализованный в PCL. Я адаптирую код, приведенный на https://github.com/atduskgreg/pcl-marching-squares-example/blob/master/marching_cubes.cpp в мое облако точек (мой код приведен ниже). Visual Studio 2015 успешно строится, но когда я запускаю его, я получаю сообщение об ошибке с ошибкой утверждения отладки. Выражение "векторный индекс вне допустимого диапазона". Можете ли вы помочь мне с этим сообщением об ошибке? Еще один вопрос: если я могу успешно создать полигональную сетку, как я могу экспортировать ее в формат .obj, .ply или .wrl? Я с нетерпением жду ответа от вас С уважением

#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); 

} 

person user887912    schedule 24.04.2017    source источник
comment
Вероятно, мне было бы полезно узнать, вызов какой функции приводит к ошибке утверждения.   -  person Gert Wollny    schedule 24.04.2017


Ответы (1)


Похоже, индекс вектора вне допустимого диапазона возникает из-за индексации в cloud_with_normals в [0]. Я бы проверил размер облака и cloud_normals и посмотрел, дает ли concatenateFields() ожидаемый результат. Поскольку вы используете Visual Studio, вы можете использовать инструменты отладки, чтобы увидеть, когда начинается непредвиденное поведение.

person brad    schedule 24.04.2017