PCL点云上采样: Moving Least Squares

背景:

pcl官方教程:点击打开链接

运行版本:pcl 1.8.1


1. 使用感受:

这一官方的教程是一个垃圾。对,就是这么直白。你跑一下代码,你就会首先遇到这个编译错误:

/home/camsense/Desktop/UpSample/src/main.cpp:122: warning: ‘void pcl::MovingLeastSquares<PointInT, PointOutT>::setPolynomialFit(bool) [with PointInT = pcl::PointXYZ; PointOutT = pcl::PointNormal]’ is deprecated: [pcl::surface::MovingLeastSquares::setPolynomialFit] setPolynomialFit is deprecated. Please use setPolynomialOrder instead. [-Wdeprecated-declarations]
   mls.setPolynomialFit (true);

原因是:2017年9月pcl弃用了setPolynomialFit()这个函数。

解决办法:删掉这行代码。

然后再跑这个代码,Segmentation fault (core dumped)。这就无解了,我安装的pcl版本是release版本,想debug也不行。

然后呢,我就试试调一下参数,看能不能跑起来。当你往setSearchRadius()里填0.005你就会发现能跑起来了,而且一定要小于等于0.005,而且这个数值只对应 bun0.pcd这个点云。

那么输出的结果怎样?

只有20个点输出。从397个点降为20个点,但我明明想要做的是上采样,不是下采样。。。

而且,这样脆弱的算法,不适宜应用开发。


如果你嫌弃这个官方文档不好用呢,你可以参考pcl/tools/mls_smoothing.cpp文件,或者点击打开链接


2. 算法细节:

在点云表面上滑动,对于每一个点,找它的领近点,用它的领近点拟合一个曲面,然后再在这个曲面上生成点。

拟合的模型是3维的多项式曲面函数,这个多项式的degree要大于等于2,因为1就代表的是平面。拟合的cost funtion就是真实点和平面之间的距离的最小二乘值。


3. 调参:

不要调了,放弃吧。能调好都是运气啊。


4. 总结:

这个算法本身是一个牛逼算法 (by Lancaster and Salkauskas 1981), 论文在点击打开链接. 有兴趣的可以自己复现,与博主分享一下。但是这个pcl1.8.1里的版本,可以说不能用。参数调整非常重要,调不好,效果不好而且程序会崩。所以,不适用于应用开发。因为不同的点云,需要不同searchRadius。。。




猜你喜欢

转载自blog.csdn.net/ambitiousruraldog/article/details/80374520