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
相关产品推荐
相关产品推荐

