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