PCL: объединение двух наборов точек в одно облако и визуализация с помощью PCL cloudviewer

Я пытаюсь объединить два набора точек из двух разных представлений в одно облако точек и визуализировать его с помощью средства просмотра облаков PCL.

    mPtrPointCloud->points.clear();
    mPtrPointCloud->points.resize(mFrameSize * 2);
    auto it = mPtrPointCloud->points.begin();
    received = PopReceived();
    if (received != nullptr)
    {
        // p_data_cloud = (float*)received->mTransformedPC.data;
        p_data_cloud = (float*)received->mCVPointCloud.data;
        index = 0;
        for (size_t i = 0; i < mFrameSize; ++i) 
        {
            float X = p_data_cloud[index];
            if (!isValidMeasure(X)) // Checking if it's a valid point
            {
                it->x = it->y = it->z = it->rgb = 0;
            }
            else 
            {
                it->x = X;
                it->y = p_data_cloud[index + 1];
                it->z = p_data_cloud[index + 2];
                it->rgb = convertColor(p_data_cloud[index + 3]); // Convert a 32bits float into a pcl .rgb format
            }
            index += 4;
            ++it;
        }
    }

    frame = PopFrame();
    if (frame != nullptr)
    {
        // p_data_cloud = frame->mSLPointCloud.getPtr<float>();
        p_data_cloud = (float*)frame->mCVPointCloud.data;
        index = 0;

        for (size_t i = 0; i < mFrameSize; ++i) 
        {
            float X = p_data_cloud[index];
            if (!isValidMeasure(X)) // Checking if it's a valid point
            {
                it->x = it->y = it->z = it->rgb = 0;
            }
            else 
            {
                it->x = X;
                it->y = p_data_cloud[index + 1];
                it->z = p_data_cloud[index + 2];
                it->rgb = convertColor(p_data_cloud[index + 3]); // Convert a 32bits float into a pcl .rgb format
            }
                index += 4;
                ++it;
            }
        }
mPtrPCViewer->showCloud(mPtrPointCloud);

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

Может ли кто-нибудь помочь объяснить, как действительно объединить два набора точек в одно облако? Спасибо

как вы получаете эти облака точек?

ignacio 07.04.2021 12:50
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
0
1
6 202
1

Ответы 1

(1) Создайте новое пустое облако точек, которое в конце будет объединенным облаком точек.

pcl::PointCloud<pcl::PointXYZ>  mPtrPointCloud;

(2) Преобразовать облака точек в исходную точку

pcl::PointCloud<pcl::PointXYZ> recieved_transformed;
Eigen::Transform<Scalar, 3, Eigen::Affine> recieved_transformation_mat(recieved.sensor_origin_ * recieved.sensor_orientation_);
pcl::transformPointCloud(recieved, recieved_transformed, recieved_transformation_mat);

pcl::PointCloud<pcl::PointXYZ> frame_transformed;
Eigen::Transform<Scalar, 3, Eigen::Affine> frame_transformation_mat(frame.sensor_origin_ * frame.sensor_orientation_);
pcl::transformPointCloud(frame, frame_transformed, frame_transformation_mat);

(3) Используйте оператор + =

mPtrPointCloud += received_transformed;
mPtrPointCloud += frame_transformed;

(4) Визуализируйте объединенное облако точек

mPtrPCViewer->showCloud(mPtrPointCloud);

Вот и все. См. Также пример http://pointclouds.org/documentation/tutorials/concatenate_clouds.phphttp://pointclouds.org/documentation/tutorials/matrix_transform.php

Это имеет тот же эффект, что и мое текущее решение, поскольку они оба добавляют точки в одно облако. Однако отображение двух облаков с разными именами может решить проблему (stackoverflow.com/questions/45783815/…). Я не совсем понимаю это сейчас. Я думаю, связано ли это с управлением буфером PCL.

rpfly3 19.09.2018 16:14

Может быть, у ваших двух облаков разные трансформации? При объединении эта информация теряется.

bashbug 19.09.2018 17:24

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

rpfly3 21.09.2018 15:21

Да, я имею в виду позы камеры. Зритель загружает два отдельных облака точек из соответствующей позы камеры. Вот почему это работает. Если вы хотите объединить два облака точек из двух разных поз камеры, вам нужно сначала преобразовать каждое из них в начало координат, а затем вы можете их объединить. Обновленный ответ!

bashbug 21.09.2018 20:53

Вы имеете в виду, что две позы камеры должны иметь одно и то же происхождение?

rpfly3 24.09.2018 17:07

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