本项目使用PCL+VTK可视化点云并编辑,因为要实现屏幕选点的功能,所以使用了PCLVisualizer中自带的回调函数,具体实现如下:
QVTKWindow的构造函数中:
//绑定类成员函数并注册
std::function<void(const pcl::visualization::PointPickingEvent&)> pickPoint =
std::bind(&QVTKWindow::pp_callback, this, std::placeholders::_1);
viewer->registerPointPickingCallback(pickPoint);
具体实现:
void QVTKWindow::pp_callback(const pcl::visualization::PointPickingEvent &event)
{
if (event.getPointIndex() == -1)
return;
PointT currentPoint;
event.getPoint(currentPoint.x, currentPoint.y, currentPoint.z);
PointCloudT currentPointCloud;
currentPointCloud.push_back(currentPoint);
PointCloudT::Ptr currentPointPtr = currentPointCloud.makeShared();
// Draw clicked points in red:将选中点用红色标记
pcl::visualization::PointCloudColorHandlerCustom<PointT> red(currentPointPtr, 255, 0, 0);
viewer->removePointCloud("currentPoint");
viewer->addPointCloud(currentPointPtr, red, "currentPoint");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "currentPoint");
std::cout << currentPoint.x << " " << currentPoint.y << " " << currentPoint.z << std::endl;
}
实现没有问题,请问现在如何将该回调函数取消注册,即我想实现取点功能的状态开关。在启动选点功能时将函数注册进去,在关闭选点功能时取消注册。