背景:
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。。。