我想编写一个函数,该函数以一个点云作为输入,并从参数中提供两个点云作为输出,如下所示。
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.
}
如何使用引用调用(不复制它)在函数之间发送和接收点云? 代码段。
谢谢。
答案 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>
。选择是你的...