You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PCL:按索引填充有序点云遇std::out_of_range问题求助

PCL有序点云填充问题解决方法

你的推测完全正确,错误根源在于cloud_2的points向量初始为空——虽然你设置了width和height,但PCL的有序点云要求points向量的大小必须等于width * height,才能通过at(i,j)合法访问对应位置。

解决方案:预分配空间后填充

要避免提前复制整个点云,只需在循环前为cloud_2的points向量预分配足够空间即可,具体修改如下:

// cloud_1是从PCD文件加载的点云指针
PointCloud<PointT>::Ptr cloud_2(new PointCloud<PointT>)

void populateSecondCloud(PointCloud<PointT>& cloud_1, PointCloud<PointT>& cloud_2){
  cloud_2.width = cloud_1.width;
  cloud_2.height = cloud_1.height;
  // 预分配points向量空间,仅分配内存不复制数据
  cloud_2.points.resize(cloud_1.width * cloud_1.height);
  // 同步点云的稠密性标记(可选,保持与原云一致)
  cloud_2.is_dense = cloud_1.is_dense;

  for (int i = 0; i < cloud_1.height; ++i){
    for(int j = 0; j < cloud_1.width; ++j){
      PointT p = cloud_1.at(i,j);
      // 对点进行处理...
      cloud_2.at(i,j) = p;
    }
  }
}
populateSecondCloud(*cloud_1, *cloud_2)

补充:更高效的线性遍历

如果你的处理逻辑不依赖二维坐标(i,j),可以直接用线性索引遍历,省去二维转一维的计算开销:

void populateSecondCloud(PointCloud<PointT>& cloud_1, PointCloud<PointT>& cloud_2){
  cloud_2.width = cloud_1.width;
  cloud_2.height = cloud_1.height;
  cloud_2.points.resize(cloud_1.points.size());
  cloud_2.is_dense = cloud_1.is_dense;

  for (size_t idx = 0; idx < cloud_1.points.size(); ++idx) {
    PointT p = cloud_1.points[idx];
    // 处理点...
    cloud_2.points[idx] = p;
  }
}

两种方式都不会提前复制原点云数据,仅分配必要的内存空间,适合处理大规模点云场景。

内容的提问来源于stack exchange,提问作者J.Osw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:50:22