在 PCL 中获取点所属的视口 ID 或点云
Get the viewport id or a point cloud to which a point belongs in PCL
我正在使用 PCL 库使用两个点云进行配准。两个点云使用视口 v1
和 v2
在两个不同的 windows 中显示。第三个 window 显示在两个 windows 下方,以使用视口 v3
显示注册的云。所有视口都由一个名为 m_viewer
的 PCLVisualizer
使用。工作流程是 select 点对应 v1
和 v2
进行注册,在 v3
中显示。程序图片如下:
Main display of the program
现在我正在尝试实现一个突出显示用户点击的点的功能。因此,如果用户单击视口 v1
或 v2
中的某个点,它将在函数 markSelectedPoint
中使用白色突出显示。
我想将突出显示的点存储在两个不同的点云 markedPointsCloudLeft
和 markedPointsCloudRight
.
中
要更新点云的可视化,在 PCL 我必须调用 updatePointCloud
。据我所知,在 PCL 中它看起来像这样:
m_viewer->updatePointCloud(markedPointsCloudLeft, white, "marked cloud left");
或
m_viewer->updatePointCloud(markedPointsCloudRight, white, "marked cloud right");
因此,如果我单击左侧视口 v1
,markedPointsCloudLeft
应该会更新,右侧视口也是如此。这是我的问题:
如果我点击任何点云,我必须告诉 markSelectedPoints
我点击了哪个。为此,我需要云所在视口的 ID 或 selected 点所属的点云。因此,例如,如果我单击左侧的点云,我必须告诉 markSelectedPoints
我指的是 v1
或者该点属于 markedPointsCloudLeft
。到目前为止,我还没有在 PCL 中找到任何函数或方法。
你知道我怎样才能做到这一点吗?或者是否有其他解决方法来获取此数据?提前致谢!
我已经找到问题的解决方案,在 pcl 源中做一些更改以获取云名称作为输出,请替换 pcl 文件中的以下喜欢的文件
https://github.com/PointCloudLibrary/pcl/blob/fbd067e58a499d4328155edc1584898fb8454e58/visualization/src/point_picking_event.cpp
伙计们,我找到了一个解决方案...虽然它不是一个真正的解决方案,但更像是一个相当肮脏的解决方法。
首先,我对 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采纳!
我正在使用 PCL 库使用两个点云进行配准。两个点云使用视口 v1
和 v2
在两个不同的 windows 中显示。第三个 window 显示在两个 windows 下方,以使用视口 v3
显示注册的云。所有视口都由一个名为 m_viewer
的 PCLVisualizer
使用。工作流程是 select 点对应 v1
和 v2
进行注册,在 v3
中显示。程序图片如下:
Main display of the program
现在我正在尝试实现一个突出显示用户点击的点的功能。因此,如果用户单击视口 v1
或 v2
中的某个点,它将在函数 markSelectedPoint
中使用白色突出显示。
我想将突出显示的点存储在两个不同的点云 markedPointsCloudLeft
和 markedPointsCloudRight
.
要更新点云的可视化,在 PCL 我必须调用 updatePointCloud
。据我所知,在 PCL 中它看起来像这样:
m_viewer->updatePointCloud(markedPointsCloudLeft, white, "marked cloud left");
或
m_viewer->updatePointCloud(markedPointsCloudRight, white, "marked cloud right");
因此,如果我单击左侧视口 v1
,markedPointsCloudLeft
应该会更新,右侧视口也是如此。这是我的问题:
如果我点击任何点云,我必须告诉 markSelectedPoints
我点击了哪个。为此,我需要云所在视口的 ID 或 selected 点所属的点云。因此,例如,如果我单击左侧的点云,我必须告诉 markSelectedPoints
我指的是 v1
或者该点属于 markedPointsCloudLeft
。到目前为止,我还没有在 PCL 中找到任何函数或方法。
你知道我怎样才能做到这一点吗?或者是否有其他解决方法来获取此数据?提前致谢!
我已经找到问题的解决方案,在 pcl 源中做一些更改以获取云名称作为输出,请替换 pcl 文件中的以下喜欢的文件 https://github.com/PointCloudLibrary/pcl/blob/fbd067e58a499d4328155edc1584898fb8454e58/visualization/src/point_picking_event.cpp
伙计们,我找到了一个解决方案...虽然它不是一个真正的解决方案,但更像是一个相当肮脏的解决方法。
首先,我对 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采纳!