Как обмениваться облаками точек между функциями?

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

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
40
2

Ответы 2

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

Я использовал PointCloud<PointXYZ>. Я не получал ошибок, когда использовал вызов по ссылке. Но программа не работала должным образом. Синтаксических ошибок не наблюдалось.

user10299403 29.10.2018 11:09

Так почему вы решили, что проблема в определении вашей функции?

Mark Loyman 30.10.2018 12:22

Изменения, внесенные в данные внутри функции, не были отражены.

user10299403 31.10.2018 12:17

Соглашение, которое используют люди из библиотеки 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>. Твой выбор...

Другие вопросы по теме