在 PCL 中获取点所属的视口 ID 或点云

Get the viewport id or a point cloud to which a point belongs in PCL

我正在使用 PCL 库使用两个点云进行配准。两个点云使用视口 v1v2 在两个不同的 windows 中显示。第三个 window 显示在两个 windows 下方,以使用视口 v3 显示注册的云。所有视口都由一个名为 m_viewerPCLVisualizer 使用。工作流程是 select 点对应 v1v2 进行注册,在 v3 中显示。程序图片如下:

Main display of the program

现在我正在尝试实现一个突出显示用户点击的点的功能。因此,如果用户单击视口 v1v2 中的某个点,它将在函数 markSelectedPoint 中使用白色突出显示。 我想将突出显示的点存储在两个不同的点云 markedPointsCloudLeftmarkedPointsCloudRight.

要更新点云的可视化,在 PCL 我必须调用 updatePointCloud。据我所知,在 PCL 中它看起来像这样:

m_viewer->updatePointCloud(markedPointsCloudLeft, white, "marked cloud left");

m_viewer->updatePointCloud(markedPointsCloudRight, white, "marked cloud right");

因此,如果我单击左侧视口 v1markedPointsCloudLeft 应该会更新,右侧视口也是如此。这是我的问题:

如果我点击任何点云,我必须告诉 markSelectedPoints 我点击了哪个。为此,我需要云所在视口的 ID 或 selected 点所属的点云。因此,例如,如果我单击左侧的点云,我必须告诉 markSelectedPoints 我指的是 v1 或者该点属于 markedPointsCloudLeft。到目前为止,我还没有在 PCL 中找到任何函数或方法。

你知道我怎样才能做到这一点吗?或者是否有其他解决方法来获取此数据?提前致谢!

我已经找到问题的解决方案,在 pcl 源中做一些更改以获取云名称作为输出,请替换 pcl 文件中的以下喜欢的文件 https://github.com/PointCloudLibrary/pcl/blob/fbd067e58a499d4328155edc1584898fb8454e58/visualization/src/point_picking_event.cpp

https://github.com/PointCloudLibrary/pcl/blob/fbd067e58a499d4328155edc1584898fb8454e58/visualization/include/pcl/visualization/area_picking_event.h

https://github.com/PointCloudLibrary/pcl/blob/fbd067e58a499d4328155edc1584898fb8454e58/visualization/include/pcl/visualization/point_picking_event.h

伙计们,我找到了一个解决方案...虽然它不是一个真正的解决方案,但更像是一个相当肮脏的解决方法。

首先,我对 m_rightCloud 应用了一个偏移量。此偏移量是根据具有最大 x 的 m_leftCloud 点与具有最小 x 的 m_rightCloud 点之间的距离计算的。

接下来,我将左右点云转移到一个kd树上。有关详细信息,请参阅 this link

现在,将函数 nearestKSearch 应用于两棵树。这将填充两个包含平方距离的向量。对于这种情况,两个向量都只包含一个值,因为只需要其中一个点。

现在比较两个向量的值。包含较小值的一个向量将告诉您该点属于哪个云。

主要功能的代码:

if (kdtreeLeft.nearestKSearch(inputPoint, 1, pointSearchValsLeft, pointSqDLeft) > 0 &&
    kdtreeRight.nearestKSearch(inputPoint, 1, pointSearchValsRight, pointSqDRight) > 0) {
    // Call index 0 because only one value is in the vectors
    if (pointSqDLeft.at(0) < pointSqDRight.at(0)) {
        return "left cloud!";
    } else {
        return "right cloud!";
    }
}

我觉得这仍然是一个糟糕的解决方案,因为偏移量的确定真的很俗气。另请注意,这仅适用于这种情况。如果您使用两个或多个重叠的点云,此解决方案将难以奏效。

如果有人找到更好的解决方案,欢迎post采纳!