点云顺序调用pcl::RandomSample多次返回相同索引问题求助
问题根因
pcl::RandomSample为了保证算法结果可复现,默认使用固定的随机数种子,同一个采样实例只要没有更新种子,多次调用filter()接口时会生成完全相同的随机序列,最终返回的采样索引就会完全一致,这是PCL的刻意设计而非bug。
操作错误点
复用了同一个pcl::RandomSample实例重复执行采样,没有在两次调用filter()之间更新随机种子,不符合非固定结果的随机采样需求。
修复方案
只需在每次调用filter()前,调用setSeed()接口传入新的随机种子即可,推荐使用std::random_device生成真随机种子避免重复:
#include <random> // 随机数生成设备,用于生成随机种子 std::random_device rd; pcl::RandomSample<pcl::PointXYZRGB> sample(false); sample.setInputCloud(cloud); sample.setSample(5); pcl::Indices indices; // 第一次采样前设置随机种子 sample.setSeed(rd()); sample.filter(indices); for (auto &i : indices) { std::cout << i << std::endl; } std::cout << "==========" << std::endl; indices.clear(); // 第二次采样前重新设置新的随机种子 sample.setSeed(rd()); sample.filter(indices); for (auto &i : indices) { std::cout << i << std::endl; }
如果不需要复用采样实例,也可以每次采样前重新创建新的pcl::RandomSample对象,效果一致。
内容的提问来源于stack exchange,提问作者Morten Nissov
相关产品推荐
相关产品推荐

