【问题标题】:PCL: merging two sets of points to one cloud and visualizeing with PCL cloudviewerPCL:将两组点合并到一个云中并使用 PCL cloudviewer 进行可视化
【发布时间】:2019-02-22 21:07:21
【问题描述】:

我正在尝试将来自两个不同视图的两组点合并到一个点云中,并使用 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);

我想要的是两组点“融合”到一帧。但是,这两组点似乎仍然一个接一个地单独显示。

谁能帮助解释如何真正将两组点合并到一个云中?谢谢

【问题讨论】:

  • 你是如何获取这些点云的?

标签: visualization point-cloud-library


【解决方案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.php http://pointclouds.org/documentation/tutorials/matrix_transform.php

【讨论】:

  • 这与我当前的解决方案具有相同的效果,因为它们都将点添加到一个云中。但是,显示两个不同名称的云可以解决问题(stackoverflow.com/questions/45783815/…)。我现在不完全明白。我在想这是否与 PCL 的缓冲区管理有关。
  • 会不会是你的两个云有不同的变换?如果合并,此信息将丢失。
  • 我不太确定您对不同转换的含义。你的意思是不同的相机姿势?他们以不同的姿势拍摄。然而,即便如此,它们之间也有一些重叠。我认为应该可以将它们合并到同一个视图中。并且通过链接中的方法,我可以看到它们具有相同的视图。
  • 是的,我的意思是相机姿势。查看器从它们各自的相机姿势加载两个单独的点云。这就是它起作用的原因。如果要连接来自两个不同相机姿势的两个点云,则必须先将它们中的每一个转换为原点,然后才能合并它们。更新答案!
  • 你的意思是这两个相机姿势应该有相同的原点吗?
猜你喜欢
  • 2012-04-23
  • 2020-09-20
  • 2021-04-06
  • 2018-01-31
  • 1970-01-01
  • 2016-07-31
  • 2014-02-15
  • 2017-02-07
  • 2023-03-20
相关资源
最近更新 更多