所以我一直在使用pcl
SampleConsensus
模块做一些线条拟合,我发现pcl
点云用法非常奇怪。我目前正在寻找最突出的线路,然后我再次检索云中的异常值和ransac。
所以在云上执行ransac说我有一些设置:
pcl::PointCloud<pcl::PointXYZ>::Ptr dataCloud(shared_ptr_cloud_from_elsewhere);
pcl::PointCloud<pcl::PointXYZ>::Ptr outlierCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr modelLine(
new pcl::SampleConsensusModelLine<pcl::PointXYZ>(dataCloud));
//Pay careful attention to line below because its position determines
//if the code is going to work or not
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr modelLine2(
new pcl::SampleConsensusModelLine<pcl::PointXYZ>(outlierCloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(modelLine);
ransac.compute();
ransac.inliers(inliers);
使用ExtractIndices
我从内部列表的负片中检索异常值,并将它们放在outlierCloud
中。 outlierCloud
已经过检查,并且肯定有分数。然后,我应该做的就是更改模型ransac
正在使用并再次使用:
ransac.setSampleConsensusModel(modelLine2)
ransac.compute(); //This will fail, due to having no points.
所以ransac.compute()
失败了,但为什么呢? modelLine2
已定义并且指向云outlierCloud
,它肯定有点?
所以我说要注意这一行,如果你移动它以便在modelLine2
填写后定义outlierCloud
那么它就可以了。同样的例子。
这告诉我pcl
正在对此云进行深层复制,即使它请求共享指针?难道这不是很疯狂吗?在我的结尾没有范围更改或任何有趣的事情发生,为什么我必须在云中填充数据后创建modelLine2
?
答案 0 :(得分:1)
没有进行深层复制,但SampleConsusModel的constructor在内部调用其setInputCloud方法,该方法存储(如预期)指向云的指针,调整索引集的大小用于云的当前大小的点数(在您的情况下为0
)。所以指针是正确的,但模型使用0
索引指向它所指向的云。
作为一种解决方法,您可以在setInputCloud
填写后自行致电outlierCloud
。