PCL点云之旅11 - 点云鼠标指针镭射选点

401 阅读1分钟

实现效果

image.png

步骤拆分

  1. 首先注册一个callback_args结构体。
  2. 结构体存放两个类型变量,一种是存放clicked_points_3d这个变量
  3. 一种是viewer的指针
  4. 我们通过registerPointPicker来注册这个鼠标点击选点的函数
  5. 在这个函数内部我们通过event获取到点击的点,然后将这个点给他记录下来
  6. 然后将这个点给他push_back到current_point里面去
  7. 做个if判断,我们不能选择3个以上的点。将点设置为红色,并且清楚那些被选中的点
  8. 将我们的红点给他推入进去
  9. 设置选中的点云大小为10

代码实现

struct callback_args{
    // structure used to pass arguments to the callback function
    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();
}