实现效果

步骤拆分
- 首先注册一个callback_args结构体。
- 结构体存放两个类型变量,一种是存放clicked_points_3d这个变量
- 一种是viewer的指针
- 我们通过
registerPointPicker来注册这个鼠标点击选点的函数
- 在这个函数内部我们通过event获取到点击的点,然后将这个点给他记录下来
- 然后将这个点给他push_back到current_point里面去
- 做个if判断,我们不能选择3个以上的点。将点设置为红色,并且清楚那些被选中的点
- 将我们的红点给他推入进去
- 设置选中的点云大小为10
代码实现
struct callback_args{
PointCloudT::Ptr clicked_points_3d;
pcl::visualization::PCLVisualizer::Ptr viewer;
};
void pp_callback(const pcl::visualization::PointPickingEvent& event, void* args){
MainWindow *p=(MainWindow *)args;
pcl::PointXYZRGB current_point;
event.getPoint(current_point.x, current_point.y, current_point.z);
p->clicked_points_3d->points.push_back(current_point);
if(p->clicked_points_3d->size()>4)
{
p->clicked_points_3d->clear();
}
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> red(p->clicked_points_3d, 255, 0, 0);
p->viewer->removePointCloud("clicked_points");
p->viewer->addPointCloud(p->clicked_points_3d, red, "clicked_points");
p->viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");
}
void MainWindow::point_pick(){
viewer->registerPointPickingCallback(pp_callback, this);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr clicked_points_3d_(new pcl::PointCloud<pcl::PointXYZRGB>);
this->clicked_points_3d = clicked_points_3d_;
ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui->qvtkWidget->GetInteractor(), ui->qvtkWidget->GetRenderWindow());
ui->qvtkWidget->update();
}