在PCL中将输入PointCloud中的点添加到OctreePointCloud时遇到Abort()错误

时间:2017-05-01 17:25:22

标签: c++ point-cloud-library

我遇到了一个错误,我在当前的PCL c ++程序中遇到了一些问题。我的原始代码更大,是分类项目的一部分,所以我使用以下代码进行了测试,但仍然遇到了我的问题。从我的八叉树调用addPointsFromInputCloud()时,函数对第一个点运行一次,然后似乎无法读取定义的输入云所在的内存。它抛出以下错误:R6010 - 已调用abort()。我正在使用PCL 1.8和Visual Studio 2012.我已经在这个项目中启动并运行了PCL,但是在项目的一个不相关的部分更改了一些二进制读取代码后,昨天开始出现这个问题。在我的头文件中,我包括:

    #include <pcl\point_types.h>
    #include <pcl\point_cloud.h>
    #include <pcl\octree\octree.h>

在我对应的类中的函数中,我尝试从基本的PCL八叉树教程(http://www.pointclouds.org/documentation/tutorials/octree.php)实现代码:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

    // Generate pointcloud data
    cloud->width = 1000;
    cloud->height = 1;
    cloud->points.resize (cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size (); ++i) {
        cloud->points[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);
    }

    float resolution = 128.0f;

    pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree (resolution);
    octree.setInputCloud(cloud);
    octree.addPointsFromInputCloud();

这会在尝试执行最后一行时抛出上述错误。

这是来自octree_poointcloud.hpp的代码,其中发生了故障:

    //////////////////////////////////////////////////////////////////////////////////////////////
    template<typename PointT, typename LeafContainerT, typename BranchContainerT, typename OctreeT> void
    pcl::octree::OctreePointCloud<PointT, LeafContainerT, BranchContainerT, OctreeT>::addPointsFromInputCloud ()
    {
      size_t i;

      if (indices_)
      {
        for (std::vector<int>::const_iterator current = indices_->begin (); current != indices_->end (); ++current)
        {
          assert( (*current>=0) && (*current < static_cast<int> (input_->points.size ())));

          if (isFinite (input_->points[*current]))
          {
            // add points to octree
            this->addPointIdx (*current);
          }
        }
      }
      else
      {
        for (i = 0; i < input_->points.size (); i++)
        {
          if (isFinite (input_->points[i]))
          {
            // add points to octree
            this->addPointIdx (static_cast<unsigned int> (i));
          }
        }
      }
    }

在else语句下第一次执行循环是成功的,但它似乎无法读取_input和错误。

1 个答案:

答案 0 :(得分:0)

回答了我自己的问题并想出我会让每个人都知道我的问题是什么。在我的程序的阅读部分,我改变了打包,以确保在将读取字节转换为结构时没有填充。在声明结构之后,只需将'#pragma pack(1)'更改为#pragma pack(push,1),然后在声明之后将'#pragma pack(pop)'更改为PCL。当然,直到从头开始重新编译PCL才开始......虽然吸取了教训!