如何在函数之间交换Pointcloud?

时间:2018-10-26 07:17:17

标签: point-cloud-library

我想编写一个函数,该函数以一个点云作为输入,并从参数中提供两个点云作为输出,如下所示。

void func(pointcloud<T> p1,pointcloud<T> p2,pointcloud<T> p3)
{
//this is function definition
//input pointcloud = p1
//process here
//output pointcloud = p2 & p3
}

.
.
.


func(pa, pb, pc);//this is function call

void func(pointcloud<T>& p1,pointcloud<T>& p2,pointcloud<T>& p3)
{
//this definition is not working.
}

如何使用引用调用(不复制它)在函数之间发送和接收点云? 代码段

谢谢。

2 个答案:

答案 0 :(得分:0)

我建议您使用共享指针。所有(或至少大多数)PCL类已经包含共享指针定义(当前基于boost的共享指针)。

template<T>
void func(PointCloud<T>::Ptr p1, PointCloud<T>::Ptr p2, PointCloud<T>::Pr p3)
{
...
}

您使用以下方法初始化指向点云的指针:

PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);

注意:也应使用按引用调用。您遇到什么错误?您的代码段使用pointcloud而非PointCloud,并且缺少模板类型名称定义。

答案 1 :(得分:0)

人们使用的Boost库的一个约定是返回std::pair以吐出多个(可能是不同类型的)结果。即类似于:

using namespace pcl;

std::pair<PointCloud::Ptr, PointCloud::Ptr> foo(PointCloud::Ptr &input){
    ...
    PointCloud::Ptr output1, output2;
    output1 = boost::make_shared<PointCloud>();
    output2 = boost::make_shared<PointCloud>();
    // fill outputX here
    // ...
    return std::make_pair(output1, output2);
}

通过使用Ptr,您可以避免复制点云,而只需将包装boost::shared_ptr复制到实际的点数据容器周围,该容器要轻得多。您可以通过将std::pair替换为适当大小的std::tuple来更改输出数量。

这些只是满足您需求的两种方法。如果返回集是同质的,则任何其他标准库容器也可以执行此工作,例如std::vector<PointCloud::Ptr>。选择是你的...