Как обменять pointcloud между функциями? - PullRequest
0 голосов
/ 26 октября 2018

Я хочу написать функцию, которая принимает одно облако точек в качестве входных данных и предоставляет два облака точек в качестве выходных данных из аргументов, как показано ниже.

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 голосов
/ 28 ноября 2018

Соглашение, используемое людьми из Boost Library, - возвращать 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>.Выбор за вами ...

0 голосов
/ 29 октября 2018

Я предлагаю вам использовать общие указатели.Все (или, по крайней мере, большинство) классов 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 и не содержит определения типа имени шаблона.

...