【问题标题】:Vector subscript out of range, PCL octree向量下标超出范围,PCL 八叉树
【发布时间】:2016-11-02 17:37:48
【问题描述】:

我正在尝试获取点云的最近邻居,但由于某种原因,我得到了一个矢量下标超出范围错误。当我尝试使用调试器找出它是如何超出范围时,所有的值看起来都很正常。

这是我正在使用的代码(我取自 the official documentation

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(cloud0);
pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(128.0f);
octree.setInputCloud(cloud);
octree.addPointsFromInputCloud();

pcl::PointXYZ searchPoint;
searchPoint.x = 0;
searchPoint.y = 0;
searchPoint.z = 0;

std::vector<int> pointIdxRadiusSearch;
std::vector<float> pointRadiusSquaredDistance;

float radius = 50;

std::cout << "Neighbors within radius search at (" << searchPoint.x
    << " " << searchPoint.y
    << " " << searchPoint.z
    << ") with radius=" << radius << std::endl;


if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) {
    for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i) {
        float x = cloud->points[pointIdxRadiusSearch[i]].x;
        float y = cloud->points[pointIdxRadiusSearch[i]].y;
        float z = cloud->points[pointIdxRadiusSearch[i]].z;
        std::cout << "    " << x
            << " " << y
            << " " << z
            << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
    }
}

【问题讨论】:

  • 所以你正在检查这个cloud-&gt;points[pointIdxRadiusSearch[i]].Somethingpoints 的范围是多少??您是否保证pointIdxRadiusSearch 没有值可能大于points.size() 的元素?那你能发个minimal reproducible example吗?
  • @FirstStep,问题似乎已经解决了..
  • 我没有看到它自行修复。我看到您通过错误检查“超出范围”值来修复它。干得好

标签: c++ point-cloud-library octree


【解决方案1】:

改成

if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) {
    for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i) {
        float x = cloud->points[pointIdxRadiusSearch[i]].x;
        float y = cloud->points[pointIdxRadiusSearch[i]].y;
        float z = cloud->points[pointIdxRadiusSearch[i]].z;
        std::cout << "    " << x
            << " " << y
            << " " << z
            << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
    }
}

float min_distance = 10000000000000.0f;
pcl::PointXYZ nearestNeighbour;
if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) {
    for (size_t i = 0; i < pointRadiusSquaredDistance.size(); ++i) {
        if (pointRadiusSquaredDistance[i] < min_distance) {
            min_distance = pointRadiusSquaredDistance[i]; 
            float x = cloud->points[pointIdxRadiusSearch[i]].x;
            float y = cloud->points[pointIdxRadiusSearch[i]].y;
            float z = cloud->points[pointIdxRadiusSearch[i]].z;
            nearestNeighbour.x = x;
            nearestNeighbour.y = y;
            nearestNeighbour.z = z;
        }
    }
}
std::cout << "    " << nearestNeighbour.x << " " << nearestNeighbour.y << " " << nearestNeighbour.z << 
    " (squared distance: " << min_distance << ")" << std::endl;

似乎已经修复了超出范围的向量。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多